Hi Mandy

Please see comments inline
On 20/01/14 21:49, Mandy Warren wrote:

Hi,

We have a Rest service which returns a JSON or XML response if all goes
well and a JSON / XML "Errors" object if a problem occurs. The "Errors"
object has been created using xjc ie. by generating a JAXB class from a
Schema.

Our JAXB provider looks like this:
        JAXBElementProvider jaxbElementProvider = new JAXBElementProvider
();

In our JSON provider we have specified no namespaces should be used in the
response:-
        JSONProvider jsonProvider = new
org.apache.cxf.jaxrs.provider.json.JSONProvider();
it is set to false by default
        jsonProvider.setDropRootElement(false);
the supportUnwrapped is used when reading only
        jsonProvider.setSupportUnwrapped(true);
Ignoring namespaces is only effective on the write side
        jsonProvider.setIgnoreNamespaces(true);
        jsonProvider.setSchemaHandler(schemaHandler);
        jsonProvider.setValidateOutput(true);


In our integration tests we have code as follows:-

            assertEquals(400, response.getStatus());
            Errors errors = response.readEntity(Errors.class);
            assertEquals("ABC_001", errors.getError().get(0).getCode());

ie. we are asserting we get the correct HTTP status code back and that we
get an Errors object containing an Error with a specific sub error code.

This works fine when using XML as the mime type but when using JSON, our
code fails at the line: Errors errors = response.readEntity(Errors.class)
with the following exception:

javax.ws.rs.MessageProcessingException: javax.ws.rs.BadRequestException:
com.sun.istack.SAXParseException2; columnNumber: 0; unexpected element
(uri:"", local:"ns2.Errors"). Expected elements are <
{http://www.xx.com/schema/framework/ErrorV01}Errors>
    at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity
(ResponseImpl.java:335)
    at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity
(ResponseImpl.java:286)
    at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity
(ResponseImpl.java:276)

Is there anyway to get the response.readEntity() method to ignore
namespaces?

It depends on what exactly you'd to do with the JSON payload.
Do you plan the server to return a namespace-qualified JSON ? This is rarely used in practice, AFAIK, at least when we have say a browser based client, it can indeed be handy when working with CXF clients as the namespace info can be used to unmarshall.

In the trace above, what happens is that the server-based JSONProvider adds a 'ns2' prefix by default and the client one, finding no namespace map (the one which would tell it to interpret 'ns2' as a prefix for http://www.xx.com/schema/framework/ErrorV01) passes it as is to JAXB and we have a failure.

The easiest way to fix it is to have a client side JSONProvider set up with a namespaceMap property, which will have a ns1:http://www.xx.com/schema/framework/ErrorV01 pair added to it.

The other option is actually configure the server side to ignore the namespaces, - this will simplify reading the response for non-CXF clients, while on the client side you can setup JSONProvider with an inTransformElements map containing a '*:{http://www.xx.com/schema/framework/ErrorV01}*' pair, see

http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-CustomizingJAXBXMLandJSONinputandoutput

HTH, Sergey

Many thanks

Mandy



--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Reply via email to