Hi everybody!!

Server is configured with cxf (2.7.6 or 2.7.10), Spring 3.2.3 and jboss-as-7.2. I encounter a problem using cxf and jaxb xsd validation. Here is the service declaration :

        <jaxrs:server id="services" address="/">
                <jaxrs:serviceBeans>
                        <bean class="com.myCompany.ServiceInterface" />
                </jaxrs:serviceBeans>
                 <jaxrs:providers>
                        <ref bean="JSONProvider" />
                        <ref bean="JAXBProvider" />
                        <ref bean="ExceptionHandler" />
                </jaxrs:providers>
         </jaxrs:server>

<bean id="ExceptionHandler" class="com.myCompany.util.ExceptionHandler" /> <bean id="JSONProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />

<bean id="JAXBProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
                 <property name="singleJaxbContext" value="true" />
                <property name="marshallerProperties" ref="propertiesMap"/>
                 <property name="validateOutput" value="true" />
                <property ref="schemaHolder" name="schemaHandler"/>
         </bean>

        <util:map id="propertiesMap">
<entry key="jaxb.formatted.output"><value type="java.lang.Boolean">true</value></entry>
        </util:map>

<bean id="schemaHolder" class="org.apache.cxf.jaxrs.utils.schemas.SchemaHandler"> <property name="schemas" ref="XMLISchemas"/> <!-- XMLIschemas contains the path of every xds to use -->
        </bean>

XSD validation functionnality work perferctly in both way and my erroneous payload (bad tag or bad value) are generating exception outside of my service code. This is great, but I'd like to produce a specific response to user in case of xsd validation exception. So I introduced the ExceptionHandler bean and I figured out that thrown exception was not the one expected (SAXParseException or UnmarshalException) but an AbstractMethodError.
Here is the (full) stacktrace :

17:55:30,314 INFO [stdout] 24-03-14 16:55:30[WARN ][o.a.c.j.p.AbstractJAXBProvider][javax.xml.bind.UnmarshalException
17:55:30,320 INFO  [stdout]  - with linked exception:
17:55:30,321 INFO [stdout] [org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 4; cvc-complex-type.2.4.a: Invalid content was found starting with element 'direct'. One of '{direction}' is expected.] 17:55:30,321 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:483) 17:55:30,321 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:417) 17:55:30,321 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:386) 17:55:30,322 INFO [stdout] at org.apache.cxf.jaxrs.provider.JAXBElementProvider.unmarshalFromInputStream(JAXBElementProvider.java:272) 17:55:30,322 INFO [stdout] at org.apache.cxf.jaxrs.provider.JAXBElementProvider.doUnmarshal(JAXBElementProvider.java:225) 17:55:30,322 INFO [stdout] at org.apache.cxf.jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.java:184) 17:55:30,322 INFO [stdout] at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1280) 17:55:30,322 INFO [stdout] at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1231) 17:55:30,323 INFO [stdout] at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:782) 17:55:30,323 INFO [stdout] at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:741) 17:55:30,323 INFO [stdout] at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:254) 17:55:30,323 INFO [stdout] at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:90) 17:55:30,324 INFO [stdout] at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 17:55:30,324 INFO [stdout] at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 17:55:30,324 INFO [stdout] at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) 17:55:30,324 INFO [stdout] at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248) 17:55:30,324 INFO [stdout] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222) 17:55:30,325 INFO [stdout] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153) 17:55:30,325 INFO [stdout] at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167) 17:55:30,325 INFO [stdout] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286) 17:55:30,325 INFO [stdout] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206) 17:55:30,326 INFO [stdout] at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 17:55:30,326 INFO [stdout] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262) 17:55:30,326 INFO [stdout] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) 17:55:30,326 INFO [stdout] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 17:55:30,326 INFO [stdout] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 17:55:30,327 INFO [stdout] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) 17:55:30,327 INFO [stdout] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) 17:55:30,327 INFO [stdout] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) 17:55:30,327 INFO [stdout] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) 17:55:30,328 INFO [stdout] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) 17:55:30,328 INFO [stdout] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) 17:55:30,328 INFO [stdout] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) 17:55:30,328 INFO [stdout] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) 17:55:30,328 INFO [stdout] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) 17:55:30,329 INFO [stdout] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) 17:55:30,329 INFO [stdout] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) 17:55:30,329 INFO [stdout] at java.lang.Thread.run(Thread.java:722) 17:55:30,329 INFO [stdout] Caused by: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 4; cvc-complex-type.2.4.a: Invalid content was found starting with element 'direct'. One of '{direction}' is expected. 17:55:30,330 INFO [stdout] at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 17:55:30,330 INFO [stdout] at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source) 17:55:30,330 INFO [stdout] at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 17:55:30,330 INFO [stdout] at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 17:55:30,330 INFO [stdout] at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 17:55:30,331 INFO [stdout] at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source) 17:55:30,331 INFO [stdout] at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source) 17:55:30,331 INFO [stdout] at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source) 17:55:30,331 INFO [stdout] at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source) 17:55:30,331 INFO [stdout] at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.startElement(Unknown Source) 17:55:30,332 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:101) 17:55:30,332 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:246) 17:55:30,332 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:180) 17:55:30,332 INFO [stdout] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:415)
17:55:30,333 INFO  [stdout]        ... 36 more
17:55:30,334 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/server].[CXFServlet]] JBWEB000236: Servlet.service() for servlet CXFServlet threw exception: java.lang.AbstractMethodError: javax.ws.rs.core.Response.getStatusInfo()Ljavax/ws/rs/core/Response$StatusType; at javax.ws.rs.WebApplicationException.validate(WebApplicationException.java:186) [javax.ws.rs-api-2.0-m10.jar:2.0-m10] at javax.ws.rs.ClientErrorException.<init>(ClientErrorException.java:127) [javax.ws.rs-api-2.0-m10.jar:2.0-m10] at javax.ws.rs.BadRequestException.<init>(BadRequestException.java:92) [javax.ws.rs-api-2.0-m10.jar:2.0-m10] at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleExceptionEnd(AbstractJAXBProvider.java:688) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleJAXBException(AbstractJAXBProvider.java:700) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.java:198) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1280) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1231) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:782) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:741) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:254) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:90) [cxf-rt-frontend-jaxrs-2.7.10.jar:2.7.10] at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) [cxf-api-2.7.10.jar:2.7.10] at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-api-2.7.10.jar:2.7.10] at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1] at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_09-icedtea]

I'd like to catch the SAXException or the unmarshallingException in order to indicate the invalid message part to the sender.
It's look like a library mismatching, but I can't figure out which one.


Reply via email to