[
https://issues.apache.org/jira/browse/CXF-7791?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Nitin Bhardwaj updated CXF-7791:
--------------------------------
Summary: How to ignore Namespaces in case of CXF JAX-RS services at the
time of un-marshalling Java objects from JSON (was: Ignoring Namespaces in
case of CXF JAX-RS services at the time of un-marshalling Java objects from
JSON)
> How to ignore Namespaces in case of CXF JAX-RS services at the time of
> un-marshalling Java objects from JSON
> ------------------------------------------------------------------------------------------------------------
>
> Key: CXF-7791
> URL: https://issues.apache.org/jira/browse/CXF-7791
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.2.5
> Environment: I am using JDK 1.8.0_144, Apache CXF 3.2.5, Tomcat
> 8.0.5, and Spring 5.0.4 for this sample project.
> Reporter: Nitin Bhardwaj
> Priority: Major
> Attachments: springcxfserver.zip
>
>
> I want to use the same interface and implementation for exposing the SOAP and
> REST web service through CXF. For JAX-WS I want to use the Namespace
> Qualified elements in request and response but for JAX-RS I want to ignore
> the namespaces for both request/response.
> I am using the default Jettison JSON Provider with "ignoreNamespaces"
> property set as "true". Have a look at my config:
> {color:#205081} *<jaxws:endpoint* id="helloWorld-ws" {color}
> {color:#205081} implementor="*com.nit.ws.service.impl.HelloWorldServiceImpl*"
> address="/HelloWorldService">{color}
> {color:#205081} <jaxws:inInterceptors>{color}
> {color:#205081} <ref bean="httpAuthHeaderInterceptor" />{color}
> {color:#205081} </jaxws:inInterceptors>{color}
> *{color:#205081}</jaxws:endpoint>{color}*
>
> {color:#205081} *<jaxrs:server* id="helloWorld-rs"
> address="/helloWorldService">{color}
> {color:#205081} <jaxrs:serviceBeans>{color}
> {color:#205081} <bean class="*com.nit.ws.service.impl.HelloWorldServiceImpl*"
> />{color}
> {color:#205081} </jaxrs:serviceBeans>{color}
> {color:#205081}<jaxrs:providers>{color}
> {color:#205081} <ref bean="*jsonProvider*" />{color}
> {color:#205081} </jaxrs:providers>{color}
> {color:#205081} <jaxrs:extensionMappings>{color}
> {color:#205081} <entry key="xml" value="application/xml"/>{color}
> {color:#205081} <entry key="json" value="application/json"/>{color}
> {color:#205081} </jaxrs:extensionMappings>{color}
> *{color:#205081}</jaxrs:server>{color}*
>
> {color:#205081} <bean id="httpAuthHeaderInterceptor"
> class="com.nit.ws.security.HttpAuthHeaderInterceptor" />{color}
> {color:#205081}<bean id="*jsonProvider*"
> class="*com.nit.rs.json.StripNamespaceJsonProvider*">{color}
> {color:#205081} <property name="*ignoreNamespaces*" value="*true*" />{color}
> {color:#205081} </bean>{color}
> The *StripNamespaceJsonProvider* simply extends the default CXF's
> *JSONProvider* and calls the super class readFrom() and writeTo() methods.
> Right now it doesn't have any functionality.
> The following is the common *HelloWorldService* interface that I am using for
> both JAX-WS and JAX-RS:
> *{color:#205081}@WebService{color}*
> {color:#205081}public interface *HelloWorldService* {{color}
> {color:#205081}......{color}
> ......
> {color:#205081} @WebMethod{color}
> {color:#205081} @POST{color}
> {color:#205081} @Path("/sampleRequest"){color}
> {color:#205081} @Consumes(\{MediaType.APPLICATION_JSON,
> MediaType.APPLICATION_XML}){color}
> {color:#205081} @Produces(\{MediaType.APPLICATION_JSON,
> MediaType.APPLICATION_XML}){color}
> *{color:#205081}public OperationResponse
> sampleRequest(@WebParam(name="request") OperationRequest request);{color}*
>
> {color:#205081} @WebMethod{color}
> {color:#205081} @POST{color}
> {color:#205081} @Path("/sampleResponse"){color}
> {color:#205081} @Consumes(\{MediaType.APPLICATION_JSON,
> MediaType.APPLICATION_XML}){color}
> {color:#205081} @Produces(\{MediaType.APPLICATION_JSON,
> MediaType.APPLICATION_XML}){color}
> *{color:#205081}public OperationResponse sampleResponse();{color}*
> {color:#205081}}{color}
>
> The *sampleResponse()* method works because of "*ignoreNamespaces*" property
> has been set to "*true*" but not the *sampleRequest(OperationRequest
> request)* method.
> I used the following request JSON to test the *sampleRequest* method using a
> REST client:
> {color:#205081}{{color}
> {color:#205081} "operationRequest": {{color}
> {color:#205081} "operationName": "chottukumaru",{color}
> {color:#205081} "payload": "golmamu"{color}
> {color:#205081} }{color}
> {color:#205081}}{color}
> However, it throws up the following exception:
> {color:#d04437}16-Jul-2018 18:28:40.205 WARNING [http-nio-8080-exec-2]
> org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleExceptionStart
> javax.xml.bind.UnmarshalException{color}
> {color:#d04437} - with linked exception:{color}
> {color:#d04437}[com.sun.istack.internal.SAXParseException2; columnNumber: 0;
> unexpected element (uri:"", local:"operationRequest"). Expected elements are
> <\{http://entity.ws.nit.com/xsd}operationRequest>]{color}
> {color:#d04437} at
> com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:468){color}
> {color:#d04437} at
> com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:402){color}
> {color:#d04437} at
> com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:371){color}
> {color:#d04437} at
> org.apache.cxf.jaxrs.provider.json.JSONProvider.readFrom(JSONProvider.java:242){color}
> {color:#d04437} at
> com.nit.rs.json.StripNamespaceJsonProvider.readFrom(StripNamespaceJsonProvider.java:61){color}
> {color:#d04437} at
> org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1354){color}
> *The reason* that I found is that the default
> *org.apache.cxf.jaxrs.provider.json.JSONProvider* has two methods:
> *writeTo()* and *readFrom()*. The writeTo() method uses the property
> "*ignoreNamespaces*" to determine if namespaces have to be ignored while
> marshalling a Java object to JSON but the readFrom() method doesn't uses the
> same property to ignore the namespaces while un-marshalling the JSON into a
> Java object.
> _What approaches do we have to solve this issue? (Not sure if this is even an
> issue or am I simply unaware of some other configuration)._
> _Do we have this issue for other JSON Providers also like Jackson or Moxy?_
> I am attaching my complete web-project as a ready reference.
> [^springcxfserver.zip] It can be simply built using maven.
> I am using JDK 1.8.0_144, Apache CXF 3.2.5, Tomcat 8.0.5, and Spring 5.0.4
> for this sample project.
>
>
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)