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.