Sostituire pagina di errore con JBoss Axis2 reazione all'anomalia XML
Domanda
sto sviluppando un webservice con Axis2 1.4.1 su JBoss 4.2.3 / Tomcat 5.5.27 e Java 1.5.0 (15-B04). Esso funziona perfettamente, ma quando un'eccezione accade ottengo un errore 500 pagina HTML JBoss, invece di un guasto Axis2 XML / SOAP.
Questa behavoir è fastidioso, perché difficults per gestire gli errori nel client webservice o in SoapUI durante lo sviluppo.
Posso cambiare questo per ottenere l'errore SOAP? Forse è solo un parametro Axis2 o JBoss, ma non ho trovato alcun indizio circa.
EDIT: Qui va il nuovo stacktrace:
[ERROR] WSDoAllReceiver: security processing failed
org.apache.axis2.AxisFault: WSDoAllReceiver: security processing failed
at org.apache.rampart.handler.WSDoAllReceiver.processBasic(WSDoAllReceiver.java:214)
at org.apache.rampart.handler.WSDoAllReceiver.processMessage(WSDoAllReceiver.java:86)
at org.apache.rampart.handler.WSDoAllHandler.invoke(WSDoAllHandler.java:72)
at org.apache.axis2.engine.Phase.invoke(Phase.java:317)
at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:264)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:163)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:133)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.ws.security.WSSecurityException: The security token could not be authenticated or authorized
at org.apache.ws.security.processor.UsernameTokenProcessor.handleUsernameToken(UsernameTokenProcessor.java:155)
at org.apache.ws.security.processor.UsernameTokenProcessor.handleToken(UsernameTokenProcessor.java:53)
at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:311)
at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:228)
at org.apache.rampart.handler.WSDoAllReceiver.processBasic(WSDoAllReceiver.java:211)
... 23 more
[ERROR] Servlet.service() para servlet AxisServlet lanzó excepción
java.lang.NullPointerException
at org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:308)
at org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61)
at org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:64)
at org.apache.axis2.engine.Phase.invoke(Phase.java:317)
at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:264)
at org.apache.axis2.engine.AxisEngine.sendFault(AxisEngine.java:520)
at org.apache.axis2.transport.http.AxisServlet.handleFault(AxisServlet.java:416)
at org.apache.axis2.transport.http.AxisServlet.processAxisFault(AxisServlet.java:379)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:167)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
EDIT 2: Dopo aver dato la grazia ho scoperto che mi sbagliavo sulla versione 1.2.9-un'istantanea di Axiom. Ho costruito di nuovo, fatto in modo che i vasi in cui correttamente copiato nella directory lib e ha funzionato!
Infine, è stato un bug di Axiom, come detto nei link forniti da Vineet.
Grazie!
Soluzione
Senza dettagli dell'eccezione, posso solo ipotizzare che l'implementazione del servizio web sta gettando un'eccezione di runtime che non è un'istanza del SOAPFault o classi AxisFault (oi loro figli). Il comportamento predefinito di JBoss, in tal caso, sarebbe quello di consegnare la pagina di errore nella risposta, dal momento che i servizi web sono servlet dopo tutto.
Che di solito indica che il servizio Web deve gestire le eccezioni in modo appropriato e lanciare un errore SOAP appropriata, per evitare che l'eccezione da gocciolando lo stack di chiamate.
Aggiorna
Uno stacktrace aiuterebbe a stabilire la causa principale di questo problema. Ma ho intenzione di girare al buio in ogni caso:)
È possibile fare riferimento alla questione RAMPART-164 e vedere se questo è la vera causa del problema. Per dirla in breve, dalle informazioni disponibili, si può usare SOAP 1.2. Non sono sicuro sulla correzione essere stato propagato a AXIOM 1.2.8, però, dal momento che non ho visto alcun riferimento a WSCOMMONS-343 .
Altri suggerimenti
C'è un bug nel file jar baluardo-core. MessageBuilder in RampartSender si aspetta AxisService nel contesto del messaggio durante l'invio della risposta al client. In questo caso è nullo che genera un'eccezione NullPointer. Aggiungere un controllo nullo nel RampartMessageData e ricostruire il vaso nucleo vallo e usarlo. L'applicazione dovrebbe funzionare bene.
AxisService service = msgCtx.getAxisService();
if (service != null) {
this.customClassLoader = msgCtx.getAxisService()
.getClassLoader();
}