JAXB convalida dello schema non si verificano in un messaggio in uscita con CXF 2.3.1
-
25-09-2019 - |
Domanda
Utilizzando CXF 2.3.1.
generato Java da WSDL utilizzando JAXB.
con
<jaxws:properties>
<entry key="schema-validation-enabled" value="true" />
</jaxws:properties>
nella configurazione del client.
Il mio test crea un oggetto che non riesce questa particolare esigenza del WSDL:
<xsd:simpleType name="UUID.Content">
<xsd:annotation>
<xsd:documentation xml:lang="EN">
Universally Unique Identifier
</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:token">
<xsd:length value="36" />
<xsd:pattern
value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
</xsd:restriction>
</xsd:simpleType>
Tuttavia, il messaggio viene marshalling e rende tutto il percorso attraverso la catena intercettore in uscita.
Il WSDL è unidirezionale. Ingresso sola
wsdlLocation è specificato in un'annotazione nei Impls.
È interessante notare, i messaggi ricevuti che non superano la convalida di questo stesso vincolo vengono bloccati dalla catena intercettore durante unmarshalling.
sto testando su WebLogic. Potrei anche è necessaria prova su WebSphere.
Altri errori di convalida XSD (quali un elemento richiesto mancante) vengono catturati dal marshaller uscente.
La ragione per cui siamo passati ad CXF 2.3.1 da 2.2.6 è stato che abbiamo visto problemi simili sui messaggi in entrata. In 2.3.1, la convalida XSD completa si verifica per i messaggi in entrata, ma non per quelli in uscita.
Ecco il bug in CXF:
https://issues.apache.org/jira/browse/CXF-3233
Abbiamo lavorato intorno a questo utilizzando org.springframework.xml.validation.XmlValidator per convalidare prima di inviare il messaggio alla catena intercettore CXF. Spero in correzioni che utilizzano la catena intercettore CXF. Tuttavia, ho il sospetto che questo è un bug in CXF.
Soluzione
Ho avuto problemi simili (CXF 2.2.7) ed è stato in grado di risolverlo aggiungendo gli attributi serviceName
e endpointName
alla mia definizione <jaxws:client>
di fagioli. controllare la sezione "Configurazione di un client Primavera (opzione 1)" qui: https: / /cwiki.apache.org/CXF20DOC/jax-ws-configuration.html per ulteriori informazioni sugli attributi.
Nota: Ho anche l'attributo wsdlLocation
definito pure. Questo è probabilmente necessaria per CXF per trovare i XSD utilizzati dal servizio.
Ecco un esempio di quello che ho:
<jaxws:client id="client"
serviceClass="com.example.ServiceInterface"
address="http://example.com/endpoint"
wsdlLocation="WEB-INF/wsdl/SampleWSDLFile.wsdl"
serviceName="s:SampleService"
endpointName="s:SampleServicePort"
xmlns:s="http://www.example.com/some/namesapce">
...
</jaxws:client>
Ho anche notato che quando ho avuto questo problema l'intero schema è stato stampato nel mio file di log da parte della classe org.apache.cxf.wsdl.EndpointReferenceUtils
ogni volta che il client è stato invocato. Questo comportamento è andato via quando ho installato il mio fagiolo cliente come quello di cui sopra. Mi chiedo se stai vedendo qualcosa di simile anche ...
Un altro dettaglio Devo dire è che ho avuto un sacco di comportamento imprevisto da CXF quando non ho usato tutte le librerie CXF-forniti delineati nel file WHICH_JARS
. Vorrei anche provare aggiungendoli alla compilazione in modo che hanno la precedenza su qualsiasi server o Java fornite librerie. È sempre possibile rimuovere in un secondo momento se non sono necessarie.