On 2011-3-4, at 上午10:25, Jeffrey Knight wrote:

I have an issue with schema validation that I believe is related to
bug https://issues.apache.org/jira/browse/CXF-3233

Here's the full story, log files, and a workaround.

I have a jaxws:endpoint configured to use a wsdlLocation in a Jar file
(real namespaces etc removed):

<jaxws:endpoint xmlns:my="urn://my.namespace"
                address="jms://" 
transportId="http://cxf.apache.org/transports/jms";
                serviceName="my:service" endpointName="my:port"
                implementor="#myImplementor"
                wsdlLocation="jar:file:WEB-INF/lib/my.jar!/path/to/my.wsdl"> ...

With turn schema validation off, everything is fine.

When I enable schema validation (<entry
key="schema-validation-enabled" value="true" />) incoming requests are
validated and accepted / rejected as expected.
When a valid request comes in and passes validation, I can see it's
getting into the code, and the code is returning successfully.

However, after the code returns, nothing comes back from CXF. It's a
complete blank.

As per Dan's suggestion on IRC, I turned on logging at the root-trace
level and added a custom OutInterceptor to see what was happening.

I created an interceptor that loops through the available interceptors
and prints them out:

public void handleMessage(SoapMessage message) throws Fault  {
  log.debug("--- HELLO OUT INTERCEPTOR handleMessage ! ---");
  for(  Interceptor<? extends Message> interceptor :
message.getInterceptorChain() )
debug.log("FOUND INTERCEPTOR:" + interceptor.getClass().getName());
  }
}

===== Begin log for interceptors with schema-validation=true =====

--- HELLO OUT INTERCEPTOR handleMessage ! ---
Message.toString(): {org.apache.cxf.interceptor.LoggingOutInterceptor.log-setup=true,
javax.xml.ws.wsdl.operation= ....  JMSMessage class: jms_text
 JMSType:          null
 JMSDeliveryMode:  2
[...]
  JMS_IBM_PutTime: 00320622
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:ns="urn://my.ns ..., org.apache.cxf.mime.headers={}}
FOUND INTERCEPTOR:org.apache.cxf.jaxws.interceptors.HolderOutInterceptor FOUND INTERCEPTOR:org.apache.cxf.jaxws.interceptors.SwAOutInterceptor FOUND INTERCEPTOR:org .apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor FOUND INTERCEPTOR:org .apache .cxf.binding.soap.interceptor.SoapHeaderOutFilterInterceptor FOUND INTERCEPTOR:org .apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor FOUND INTERCEPTOR:org.apache.cxf.interceptor.MessageSenderInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.LoggingOutInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.AttachmentOutInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.StaxOutInterceptor
FOUND INTERCEPTOR:org .apache.cxf.binding.soap.interceptor.SoapOutInterceptor
FOUND INTERCEPTOR:com.td.war.OutInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.BareOutInterceptor
FOUND INTERCEPTOR:org .apache.cxf.binding.soap.interceptor.SoapOutInterceptor $SoapOutEndingInterceptor FOUND INTERCEPTOR:org.apache.cxf.interceptor.StaxOutInterceptor $StaxOutEndingInterceptor FOUND INTERCEPTOR:org.apache.cxf.interceptor.MessageSenderInterceptor $MessageSenderEndingInterceptor
Invoking handleMessage on interceptor
org.apache.cxf.interceptor.BareOutInterceptor@51955195
Invoking handleMessage on interceptor
org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor $SoapOutEndingInterceptor@7db87db8
Invoking handleMessage on interceptor
org.apache.cxf.interceptor.StaxOutInterceptor $StaxOutEndingInterceptor@272f272f
Invoking handleMessage on interceptor
org.apache.cxf.interceptor.MessageSenderInterceptor $MessageSenderEndingInterceptor@52a552a5
Outbound Message
---------------------------
ID: 1
Encoding: UTF-8
Content-Type: text/xml
Headers
Payload: <soap:Envelope> .... lots of XML here, looks good! ...</ soap:Envelope>

===== End log for interceptors with  schema-validation=true =====


Now here's what happens when I turn schema validation on:


===== Begin log for interceptors with  schema-validation=true =====

Invoking handleMessage on interceptor com.td.war.OutInterceptor@30fc30fc
--- HELLO OUT INTERCEPTOR handleMessage ! ---
Message.toString(): {org.apache.cxf.interceptor.LoggingOutInterceptor.log-setup=
[...]  JMSMessage class: jms_text
 JMSType:          null
 JMSDeliveryMode:  2
[...]
 JMS_IBM_PutTime: 01030155
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:ns="urn://my.ns ..., org.apache.cxf.mime.headers={}}
========== CHECKING THE INTERCEPTORS: START ===========
FOUND INTERCEPTOR:org.apache.cxf.jaxws.interceptors.HolderOutInterceptor FOUND INTERCEPTOR:org.apache.cxf.jaxws.interceptors.SwAOutInterceptor FOUND INTERCEPTOR:org .apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor FOUND INTERCEPTOR:org .apache .cxf.binding.soap.interceptor.SoapHeaderOutFilterInterceptor FOUND INTERCEPTOR:org .apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor FOUND INTERCEPTOR:org.apache.cxf.interceptor.MessageSenderInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.LoggingOutInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.AttachmentOutInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.StaxOutInterceptor
FOUND INTERCEPTOR:org .apache.cxf.binding.soap.interceptor.SoapOutInterceptor
FOUND INTERCEPTOR:com.td.war.OutInterceptor
FOUND INTERCEPTOR:org.apache.cxf.interceptor.BareOutInterceptor
FOUND INTERCEPTOR:org .apache.cxf.binding.soap.interceptor.SoapOutInterceptor $SoapOutEndingInterceptor FOUND INTERCEPTOR:org.apache.cxf.interceptor.StaxOutInterceptor $StaxOutEndingInterceptor FOUND INTERCEPTOR:org.apache.cxf.interceptor.MessageSenderInterceptor $MessageSenderEndingInterceptor
========== CHECKING THE INTERCEPTORS: END ===========
Invoking handleMessage on interceptor
org.apache.cxf.interceptor.BareOutInterceptor@2a262a26
Invoking handleFault on interceptor
org.apache.cxf.interceptor.BareOutInterceptor@2a262a26
Invoking handleFault on interceptor com.td.war.OutInterceptor@30fc30fc
Invoking handleFault on interceptor
org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor@2ac12ac1
Invoking handleFault on interceptor
org.apache.cxf.interceptor.StaxOutInterceptor@29ee29ee
Invoking handleFault on interceptor
org.apache.cxf.interceptor.AttachmentOutInterceptor@29d329d3
Invoking handleFault on interceptor
org.apache.cxf.interceptor.LoggingOutInterceptor@166d166d
Invoking handleFault on interceptor
org.apache.cxf.interceptor.MessageSenderInterceptor@2b2a2b2a
Invoking handleFault on interceptor
org .apache .cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor@2ab02ab0
Invoking handleFault on interceptor
org .apache .cxf.binding.soap.interceptor.SoapHeaderOutFilterInterceptor@2a002a00
Invoking handleFault on interceptor
org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor@2c782c78
Invoking handleFault on interceptor
org.apache.cxf.jaxws.interceptors.SwAOutInterceptor@2c312c31
Invoking handleFault on interceptor
org.apache.cxf.jaxws.interceptors.HolderOutInterceptor@2c882c88
Interceptor for {urn://my.ns}MyService#{urn://my.ns}myCode has thrown
exception, unwinding now
org.apache.cxf.interceptor.Fault: Marshalling Error: cvc-elt.1: Cannot
find the declaration of element '[...]'.
at org .apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java: 256) at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java: 169)
[...]
Caused by:
javax.xml.bind.MarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration
of element [<-- the parser can't find my XSD]
[...]

Invoking handleMessage on interceptor
org.apache.cxf.binding.soap.interceptor.Soap11FaultOutInterceptor $Soap11FaultOutInterceptorInternal@40824082
Invoking handleMessage on interceptor
org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor $SoapOutEndingInterceptor@36f036f
Invoking handleMessage on interceptor
org.apache.cxf.interceptor.MessageSenderInterceptor $MessageSenderEndingInterceptor@2b512b51
Payload to be sent out is :[]
send out the message!
server sending reply:

===== End log for interceptorswith  schema-validation=true =====

You can see that the payload is empty which explains the blank
response I get when I turn validation on.
It's like the payload got lost somewhere along the way with the
exception being thrown.

I imagine what's happening is that on the outbound validation, it
can't find any XSD's to validate against.

Hi,

I think the problem you encounter is more similar with CXF-3095[1], which in turn to be a problem that misuse include/import for xsd files.
You may need take a look at that issue.

[1]https://issues.apache.org/jira/browse/CXF-3095

Freeman
I tried to remedy this by explicitly telling it where to find the
schemas that are in the jar (which would be duplicate code):

<jaxws:endpoint [...]
wsdlLocation="jar:file:WEB-INF/lib/my.jar!/path/to/my.wsdl"> ...
   <jaxws:schemaLocations>
<jaxws:schemaLocation>jar:file:WEB-INF/lib/my.jar!/path/to/ 1.xsd</jaxws:schemaLocation> <jaxws:schemaLocation>jar:file:WEB-INF/lib/my.jar!/path/to/ 2.xsd</jaxws:schemaLocation>
      etc.
   </jaxws:schemaLocations>

But that did not work.

What does work for my purposes is disabling schema validation in an
outbound interceptor.

I read through the code for
org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor and
basically just reverse engineered this from the "shouldValidate()"
method
which checks on Message.SCHEMA_VALIDATION_ENABLED:

public final class SchemaValidationDisablingOutboundInterceptor
extends AbstractSoapInterceptor
{
   public SchemaValidatingOutbountInterceptor() {
       super(Phase.MARSHAL);
   }

   public void handleMessage(SoapMessage message) throws Fault  {
       for(  Interceptor<? extends Message> interceptor :
message.getInterceptorChain() ) {
message.setContextualProperty(Message.SCHEMA_VALIDATION_ENABLED,
false);
       }
   }
}

-Jeff


--
Freeman Fang

------------------------

FuseSource: http://fusesource.com
blog: http://freemanfang.blogspot.com
twitter: http://twitter.com/freemanfang
Apache Servicemix:http://servicemix.apache.org
Apache Cxf: http://cxf.apache.org
Apache Karaf: http://karaf.apache.org
Apache Felix: http://felix.apache.org

Reply via email to