JAXB validação de esquema que não ocorrem na mensagem de saída com CXF 2.3.1
-
25-09-2019 - |
Pergunta
Usando CXF 2.3.1.
Java gerado a partir de WSDLs usando JAXB.
Usando
<jaxws:properties>
<entry key="schema-validation-enabled" value="true" />
</jaxws:properties>
na configuração do cliente.
Meu teste cria um objeto que não esta exigência específica do 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>
No entanto, a mensagem é organizado e faz todo o caminho através do interceptor de saída da cadeia.
O WSDL é um forma:somente de entrada.
wsdlLocation é especificado em uma anotação no Impls.
Curiosamente, as mensagens de entrada que falham na validação de restrição são bloqueadas pelo interceptor da cadeia durante o unmarshalling.
Eu estou testando no WebLogic.Eu também poderia testar no WebSphere é necessário.
Outros validação XSD falhas (como a ausência de um elemento obrigatório) estão sendo apanhados por uma saída de empacotador.
A razão que nós actualizado para o CXF 2.3.1 a partir de 2.2.6 foi que estávamos a ver com questões similares sobre as mensagens de entrada.Em 2.3.1, completa validação XSD ocorre para mensagens de entrada, mas não de saída queridos.
Aqui está o erro no CXF:
https://issues.apache.org/jira/browse/CXF-3233
Trabalhamos resolver isso usando org.springframework.xml.validação.XmlValidator para validar antes de enviar a mensagem para o CXF interceptor cadeia.Eu estou esperando para correções que usam o CXF interceptor cadeia.No entanto, eu suspeito que este é um bug no CXF.
Solução
Eu tive problemas semelhantes (CXF 2.2.7) e foi capaz de resolvê-lo adicionando a serviceName
e endpointName
atributos para o meu <jaxws:client>
feijão definição.confira a seção "Configurando uma Mola Cliente (Opção 1)" aqui: https://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html para obter mais informações sobre os atributos.
Nota:Eu também tenho o wsdlLocation
atributo definido como bem.Este é provavelmente necessária para CXF para encontrar os XSDs utilizados pelo serviço.
Aqui está um exemplo do que eu tenho:
<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>
Eu também notei quando eu tive esse problema de todo o esquema foi impresso para o meu arquivo de log pelo org.apache.cxf.wsdl.EndpointReferenceUtils
a classe toda vez que o cliente foi invocada.Este comportamento foi embora quando eu configurar meu cliente de feijão como o descrito acima.Eu me pergunto se você está vendo algo assim também...
Outro detalhe que devemos mencionar é que eu tinha um monte de comportamento inesperado do CXF quando eu não uso todos os CXF-desde que as bibliotecas descritas no WHICH_JARS
arquivo.Também gostaria de tentar adicioná-los para construir, de modo que eles substituem qualquer servidor ou Java fornecido bibliotecas.Você sempre pode removê-los mais tarde, se eles não forem necessários.