validation du schéma JAXB ne se produit pas dans le message sortant avec CXF 2.3.1
-
25-09-2019 - |
Question
Utilisation CXF 2.3.1.
Java généré à partir WSDLs en utilisant JAXB.
Utilisation
<jaxws:properties>
<entry key="schema-validation-enabled" value="true" />
</jaxws:properties>
dans la configuration du client.
Mon test crée un objet qui ne cette exigence particulière du 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>
Cependant, le message est rangea et fait tout le chemin à travers la chaîne d'intercepteurs sortant.
Le WSDL est à sens unique:. D'entrée uniquement
wsdlLocation est spécifié dans une annotation dans les Impls.
Fait intéressant, les messages entrants qui ne validation de cette même contrainte sont bloqués par la chaîne d'intercepteurs pendant unmarshalling.
Je teste sur WebLogic. Je pourrais aussi test sur WebSphere est nécessaire.
D'autres échecs de validation XSD (comme un manque élément requis) sont capturés par le placier sortant.
La raison pour laquelle nous sommes passés à CXF 2.3.1 de 2.2.6 était que nous voyons des problèmes similaires sur les messages entrants. Dans 2.3.1, la validation complète XSD se produit pour les messages entrants, mais pas pour les sortants.
Voici le bogue dans CXF:
https://issues.apache.org/jira/browse/CXF-3233
Nous avons travaillé autour de cela en utilisant org.springframework.xml.validation.XmlValidator pour valider avant d'envoyer le message à la chaîne d'intercepteurs CXF. J'espère que pour des solutions qui utilisent la chaîne d'intercepteurs CXF. Cependant, je pense que ce bogue dans CXF.
La solution
J'ai eu des problèmes similaires (CXF 2.2.7) et a été en mesure de le résoudre en ajoutant les serviceName
et endpointName
attribue à ma définition de haricot <jaxws:client>
. consultez la section "Configuration d'un client de printemps (Option 1)" ici: https: / /cwiki.apache.org/CXF20DOC/jax-ws-configuration.html pour plus d'informations sur les attributs.
Note: J'ai aussi l'attribut wsdlLocation
défini ainsi. Ceci est probablement nécessaire pour CXF de trouver les XSD utilisés par le service.
Voici un exemple de ce que j'ai:
<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>
J'ai aussi remarqué quand j'ai eu ce problème tout le schéma a été imprimé à mon fichier journal par la classe org.apache.cxf.wsdl.EndpointReferenceUtils
chaque fois que le client a été invoqué. Ce comportement est parti quand je place mon grain de client comme celle-ci. Je me demande si vous voyez quelque chose comme ça aussi ...
Un autre détail que je dois mentionner est que j'avais beaucoup de comportement inattendu de CXF quand je n'ai pas utilisé toutes les bibliothèques fourni CXF-décrites dans le fichier WHICH_JARS
. Je voudrais aussi essayer de les ajouter à la construction afin qu'ils remplacent tout serveur ou Java fourni bibliothèques. Vous pouvez toujours les supprimer plus tard si elles ne sont pas nécessaires.