Hi
On 07/02/14 09:08, Andrew Clark wrote:
I am trying to send a POST request with a JSON or XML body to a service. This
request body conforms to an xsd I have defined in the schemaHandler property,
which i have registered with the JSONProvider and the JAXBProvider.
<bean id="bgacRSJsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> <property name="dropRootElement" value="false"/> <property
name="supportUnwrapped" value="true"/> <property name="ignoreNamespaces" value="true"/> <property name="schemaHandler" ref="schemaHolder"/>
<property name="validateOutput" value="true"/>
<bean id="schemaHolder" class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler"> <property
name="schemas" ref="schemas"/> </bean>
<util:list id="schemas"> <value>classpath:webapi/xsd/schema.xsd</value>
</util:list>
With an xml body the service will return a valid response if the request is
valid.....if the request breaks the schema rules it will return an error as
expected. However if the request body is JSON (where no namespace is specified)
the response is an error similar to that below:
[org.xml.sax.SAXParseException; columnNumber: 0; cvc-elt.1: Cannot find the
declaration of element 'xxxRequest'.]
The xxxRequest refers to the Class of the object the resource is expecting.
Could you explain why the XML works but the JSON doesn't.
You have the JSON payload converted into the unqualified XML internally
and hence this is where the validation stops as the validator can not
find xxxRequest in the schema which has a targetNamespace
Try using an inTransformElements property with a pair like
"{myns}*":"*", this should fix it, see
http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-CustomizingJAXBXMLandJSONinputandoutput
Sergey
ThanksAndy