Estou fazendo a integração entre um Sistema de gestão hospitalar com o sistema laboratorial da empresa em que trabalho, utilizando Webservice SOAP com JPA, EJB, tendo como servidor de aplicação o Wildfly 8.2.
Este sistema de gestão hospitalar já tem um webservice pronto, documentado, que dispara um pedido de exame em XML para o meu webservice, que por sua vez deve ter um método que recebe String.
Criei o webservice e realizei testes com o SOAPUi e as coisas funcionaram normalmente, porém quando fui realizar os testes em ambiente real, ou seja, colocando os dois webservices para se comunicarem, a requisição chega no meu servidor e já aparece o seguinte erro.
10:02:19,307 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-49) Interceptor for {http://webservice.ws.sisonco.com.br/}SisoncoLabWSService#{http://webservice.ws.sisonco.com.br/}solicitarExameLIS has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unexpected wrapper element solicitarExameLIS found. Expected {http://webservice.ws.sisonco.com.br/}solicitarExameLIS.
at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:104)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:241)
at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:97)
at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:131)
at org.jboss.wsf.stack.cxf.CXFServletExt.invoke(CXFServletExt.java:88)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at org.jboss.wsf.stack.cxf.CXFServletExt.service(CXFServletExt.java:136)
at org.jboss.wsf.spi.deployment.WSFServlet.service(WSFServlet.java:140) [jbossws-spi-2.3.1.Final.jar:2.3.1.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_40]
Me parece ser algo relacionado a interceptadores do CXF. Tenho realizado pesquisas diárias em diversos sites e não consegui achar nada que pudesse realmente me ajudar ainda.
Apenas para teste, fui na minha classe de Webservice (anotada com @WebService) e criei um webservice através do Ctrl+N (opção Webservice do Eclipse), utilizando o Axis e então o erro acima parou de acontecer, mas um outro erro surgiu. Tudo que tem @Inject não funciona mais.
Fazendo a chamada do Webservice localmente ou em outra máquina através do SOAPUi, funciona normalmente, apenas quando configuro o outro webservice para disparar o XML para meu webservice é que ocorre o erro.
Também acredito que possa ser configuração, porém ainda sou novo nesse mundo de webservice, não tenho muito domínio de SOAP, nem do Wildfly.
Em relação ao standalone.xml, eu não havia configurado o schema-validation-enable e a interface default estava configurada como “public” (configurado como ) no socket-binding-group. Porém configurei também a interface “any” e a coloquei como default-interface no socket-binding-group, como você sugeriu, mas mesmo assim o erro persiste.
Segue abaixo o arquivo standalone.xml configurado no Wildfly 8.2.
Desculpe se não mencionei, mas essa integração é feita entre dois sistemas internos da empresa, então essa URL não está disponível na internet, como o próprio endereço IP já diz, está disponível apenas na rede interna.
Consigo abrir o WSDL normalmente pela URL (http://172.16.3.224:8086/SisoncoLabWS/SisoncoLabWS?wsdl) em qualquer dispositivo da minha rede, e também consigo enviar requisições através do SOAPUi de qualquer dispositivo da rede, e neste caso tudo funciona normalmente, sem erro.
desculpe tantas perguntas, mas estou querendo chegar no erro, peloq ue vi é assim: o seu cliente esta formando o corpo diferente do que o servidor espera e provavelmente é aquela namespace, você usou JAXB?
Particularmente eu teria enviado o objeto no SOAP, quando trabalhamos com Strings nós perdemos toda a validação no obejto, no servidor você pode hablitar para ver o log da requisição.
O Webservice SOAP que envia o XML como String é de um sistema terceiro, famoso nacionalmente na área da saúde, que contém documentação exigindo que para realizar a integração tenhamos um webservice do nosso lado com um método pronto para receber uma String, no caso o XML com os dados a serem integrados.
Então eu criei o webservice SOAP para o meu sistema laboratorial, contendo um método que recebe String, utilizando JAXB.
Em relação a namespace, o que eu poderia fazer?
Quando subo o Wildfly repare no valor do atributo “serviceName”:
10:01:27,804 INFO [org.jboss.ws.cxf.metadata] (MSC service thread 1-4) JBWS024061: Adding service endpoint metadata: id=br.com.sisonco.ws.webservice.SisoncoLabWS
address=http://172.16.3.224:8086/SisoncoLabWS/SisoncoLabWS
implementor=br.com.sisonco.ws.webservice.SisoncoLabWS
serviceName={http://webservice.ws.sisonco.com.br/}SisoncoLabWSService
portName={http://webservice.ws.sisonco.com.br/}SisoncoLabWSPort
annotationWsdlLocation=null
wsdlLocationOverride=null
mtomEnabled=false
Agora repare no erro:
13:09:59,590 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-24) Interceptor for {http://webservice.ws.sisonco.com.br/}SisoncoLabWSService#{http://webservice.ws.sisonco.com.br/}solicitarExameLIS has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unexpected wrapper element solicitarExameLIS found. Expected {http://webservice.ws.sisonco.com.br/}solicitarExameLIS.
Apenas para fins de teste, criei 3 projetos iguais contendo um método que recebe String e retorna essa mesma String, porém com servidores diferentes. Um com Wildfly 8.2, o outro com Glassfish 4 e o outro com o Tomcat 8.36.
O projeto com o Tomcat funcionou, ou seja, o webservice terceiro conseguiu enviar o XML e o meu webservice conseguiu recebe-lo normalmente.
Isso se deve ao fato do Tomcat ser apenas um servlet container, mais simples que o Wildfly e o Glassfish?
Não é por ser servlet-container brother é a mensagem mesmo que não esta no padrão que ele espera receber, o wildfly usa o CXF, eu uso aqui tanto WS quanto WSClient e funciona bem, experimenta desabilitar a validação para ver se passa, veja:
Eu já havia feito este teste, infelizmente desabilitar essa validação não resolveu, continua o mesmo erro.
15:19:11,157 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-33) Interceptor for {http://webservice.ws.sisonco.com.br/}SisoncoLabWSService#{http://webservice.ws.sisonco.com.br/}solicitarExameLIS has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unexpected wrapper element solicitarExameLIS found. Expected {http://webservice.ws.sisonco.com.br/}solicitarExameLIS.
O Webservice terceiro que esta me enviando o XML, tem como servidor o Tomcat e utiliza o Axis.
No caso do Wildfly, utiliza o CXF, e provavelmente está recebendo a mensagem em um formato que ele não espera receber e com isso dá o erro.
O problema está na incompatibilidade do formato da mensagem gerado pelo Axis x formato gerado/esperado pelo CXF? Como eu poderia resolver isso?
Eu fiz um teste gerando do Webservice com Axis pelo Eclipse, com o Wildfly mesmo, e ai ele passa a receber a mensagem normalmente e não acusar mais o erro. Só que tudo que é injetado com @Inject passa a não funcionar mais, ou seja, corrigi um erro e criei outro.
Eu gostaria de continuar utilizando o Wildfly como servidor de aplicação, pois utilizo EJB no projeto e o Tomcat não suporta. E também os outros projetos Java aqui também utilizam o Wildfly.
Como eu ativo esse log para ver a mensagem SOAP chegando?
Sim, a classe Mensagem está anotada com xml.
No trecho de código ConverteXmlString().unmarshal(Mensagem.class, pedidoExame); , o que eu faço é receber a String pedidoExame (XML recebido) e converter toda sua estrutura para a classe Mensagem, que contem diversas outras classes, para fazer todo o trabalho de integração.
Eu já havia tentando debugar esta aplicação desta maneira, porém sem sucesso.
Eu coloquei um breakpoint logo no início e simplesmente não entra no método, apenas fica aparendo a mensagem abaixo no log.
16:11:51,140 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-31) Interceptor for {http://webservice.ws.sisonco.com.br/}SisoncoLabWSService#{http://webservice.ws.sisonco.com.br/}solicitarExameLIS has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unexpected wrapper element solicitarExameLIS found. Expected {http://webservice.ws.sisonco.com.br/}solicitarExameLIS.
at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:104)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:241)
at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:97)
at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:131)
at org.jboss.wsf.stack.cxf.CXFServletExt.invoke(CXFServletExt.java:88)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at org.jboss.wsf.stack.cxf.CXFServletExt.service(CXFServletExt.java:136)
at org.jboss.wsf.spi.deployment.WSFServlet.service(WSFServlet.java:140) [jbossws-spi-2.3.1.Final.jar:2.3.1.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_40]
Eu acho muito estranho o debug nem iniciar.
Tem como eu interceptar essa mensagem SOAP que está chegando no Wildfly e verificar exatamente como ela está? Este seria o log que você me pediu para ativar? Desculpe a ignorância.