users@jersey.java.net

Error Marshalling Object without _at_XmlRootElement

From: Steven Ford <stevefordtn_at_gmail.com>
Date: Fri, 14 Aug 2009 10:44:07 -0500

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;
     }

}