Hi,
I think ObjectFactory does not have the required functionality because
there is no element declared in the schema. You could try adding a
xsd:element that uses the AddressType, then i suspect there will be
something in the ObjectFactory, otherwise you will have to create an
instance of JAXBElement and return that. For example:
JAXBElement<AddressType> e = new JAXBElement<AddressType>(
new QName("Address"),
AddressType.class,
address);
return e;
Paul.
On Aug 14, 2009, at 5:44 PM, Steven Ford wrote:
> I have created classes from the OAGIS 9.4 xsd's using JAXB. I am
> writing a RESTful service using Jersey that consumes & produces an
> AddressType. Basically I validate the address and put stuff in the
> userArea. The AddressType class does not have an @XmlRootElement
> annotation and I want to use the Class as it was generated by JAXB,
> so I don't want to manually add it. The XML is successful
> transformed into an AddressType object coming in but I get the
> following error when returning the AddressType:
>
> A message body writer for Java type, class
> org.openapplications.oagis._9.AddressType, and MIME media type,
> application/xml, was not found
>
> My question is: How can I have my service produce AddressType xml
>
> I have seen in some messages where it says to return a JAXBElement
> generatated from the ObjectFactory. The ObjectFactory that was
> generated by JAXB returns AddressType, not JAXBElement
>
> from ObjectFactory:
> /**
> * Create an instance of {_at_link AddressType }
> *
> */
> public AddressType createAddressType() {
> return new AddressType();
> }
>
>
>
> Here is my code:
>
> @POST
> @Path("/validate")
> @Consumes( "application/xml" )
> @Produces( "application/xml" )
> public AddressType validateAddress(AddressType address) {
> String city = address.getCityName().getValue();
> String state =
> address.getCountrySubDivisionCode().get(0).getValue();
> String zipcode = address.getPostalCode().getValue();
>
> AddressMatch validationAddress =
> AddressValidatorDao.validateAddress(city, state, zipcode);
>
> UserAreaType userArea = address.getUserArea();
> int matchLevel =
> Integer.parseInt(validationAddress.getMatchLevel());
> if(matchLevel != 0) {
> userArea.getAny().add(validationAddress);
> }else {
> List<AddressMatch> addressList =
> AddressValidatorDao.getCityStateByZipcode(zipcode);
> if(!addressList.isEmpty()) {
> userArea.getAny().add(addressList);
> }else {
> addressList = AddressValidatorDao.getZipcodeByCityState(city,
> state);
> if(!addressList.isEmpty()) {
> userArea.getAny().add(addressList);
> }else {
> userArea.getAny().add(validationAddress); //Put the original No
> Match Found
> }
> }
> }
>
> return address;
> }
>
> XSD snippet:
>
> <xsd:complexType name="AddressBaseType" abstract="true">
> <xsd:annotation>
> <xsd:documentation source="http://www.openapplications.org/oagis/
> 9"></xsd:documentation>
> </xsd:annotation>
> <xsd:sequence>
> <xsd:element ref="ID" minOccurs="0" maxOccurs="unbounded"/>
> <xsd:element ref="FormatCode" minOccurs="0"/>
> <xsd:element ref="AttentionOfName" minOccurs="0"
> maxOccurs="unbounded"/>
> <xsd:element ref="CareOfName" minOccurs="0" maxOccurs="unbounded"/>
> <xsd:choice>
> <xsd:element ref="AddressLine" minOccurs="0"
> maxOccurs="unbounded"/>
> <xsd:sequence>
> <xsd:element ref="LineOne" minOccurs="0"/>
> <xsd:element ref="LineTwo" minOccurs="0"/>
> <xsd:element ref="LineThree" minOccurs="0"/>
> <xsd:element ref="LineFour" minOccurs="0"/>
> <xsd:element ref="LineFive" minOccurs="0"/>
> </xsd:sequence>
> <xsd:sequence>
> <xsd:element ref="BuildingNumber" minOccurs="0"/>
> <xsd:element ref="BuildingName" minOccurs="0"/>
> <xsd:element ref="StreetName" minOccurs="0"/>
> <xsd:element ref="Unit" minOccurs="0"/>
> <xsd:element ref="Floor" minOccurs="0"/>
> <xsd:element ref="PostOfficeBox" minOccurs="0"/>
> <xsd:element ref="DeliveryPointCode" minOccurs="0"
> maxOccurs="unbounded"/>
> </xsd:sequence>
> </xsd:choice>
> <xsd:element ref="CitySubDivisionName" minOccurs="0"
> maxOccurs="unbounded"/>
> <xsd:element ref="CityName" minOccurs="0"/>
> <xsd:element ref="CountrySubDivisionCode" minOccurs="0"
> maxOccurs="unbounded"/>
> <xsd:element ref="CountryCode" minOccurs="0"/>
> <xsd:element ref="PostalCode" minOccurs="0"/>
> <xsd:element ref="Status" minOccurs="0"/>
> <xsd:element ref="Preference" minOccurs="0"/>
> </xsd:sequence>
> <xsd:attribute name="languageCode" type="LanguageCodeContentType"
> use="optional"/>
> <xsd:attribute name="type" type="NormalizedStringType"/>
> </xsd:complexType>
>
> <xsd:complexType name="AddressType">
> <xsd:complexContent>
> <xsd:extension base="AddressBaseType">
> <xsd:sequence>
> <xsd:element ref="UserArea" minOccurs="0"/>
> </xsd:sequence>
> </xsd:extension>
> </xsd:complexContent>
> </xsd:complexType>
>
> The AddressType Class generated by JAXB:
>
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "AddressType", propOrder = {
> "userArea"
> })
> public class AddressType
> extends AddressBaseType
> {
>
> @XmlElement(name = "UserArea")
> protected UserAreaType userArea;
>
> /**
> * Gets the value of the userArea property.
> *
> * @return
> * possible object is
> * {_at_link UserAreaType }
> *
> */
> public UserAreaType getUserArea() {
> return userArea;
> }
>
> /**
> * Sets the value of the userArea property.
> *
> * @param value
> * allowed object is
> * {_at_link UserAreaType }
> *
> */
> public void setUserArea(UserAreaType value) {
> this.userArea = value;
> }
>
> }
>
>