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