Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests

Wiplash4

Aktives Mitglied
Das Problem ist wie folgt. Ich versuche einen Handler zu implementieren. Dieser soll die Nachricht rausschreiben aber auch anderes leisten.
In meiner Fantasie funktioniert der Handler wie folgt: Wenn eine Nachricht eintrifft, wird als erstes die Methode handleMessage aufgerufen, richtig? Das sollte mir die Moeglichkeit geben die Nachricht abzufangen und speichern.
Was habe ich falsch gemacht?

[CODE lang="java" title="Interfaceklasse" highlight="16"]package defaultPackage;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.jws.HandlerChain;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.soap.MTOM;

@HandlerChain(file = "handlers.xml", name = "Handler")
@WebService(targetNamespace = "http://www.beispiel.de/beispiel/beispiel", serviceName = "Beispiel", portName = "BeispielPort")
@MTOM(enabled = true)
@SOAPBinding
@Stateless
@XmlSeeAlso({ ObjectFactory.class })
public class CustomFaceBean implements CustomFace
{

/** Die CM_VERSION. */
public static final String CM_VERSION = "$Revision:$ $HeadURL:$";

@Inject
protected Worker worker;
/**
*
*/
@PostConstruct
protected void postConstruct()
{
System.setProperty("com.Sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.Sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.Sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.Sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
}

@Override
@WebMethod(operationName = "execute")
@WebResult(name = "objectToBeReturned")
public ObjectToBeReturned methodToBeCalled(
@WebParam(name = "param1") Param1 param1,
@WebParam(name = "param2") Param2 param2,
@WebParam(name = "param3") Param3 param3)
{
return worker.execute(param1, param2, param3);
}


}[/CODE]

[CODE lang="xml" title="handlers.xml"]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>Handler</handler-name>
<handler-class>defaultPackage.Handler</handler-class>
</handler>
</handler-chain>
</handler-chains>
</jaxws:bindings>[/CODE]

[CODE lang="java" title="Handler.java"]package defaultPackage;

import java.util.Collections;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jws.HandlerChain;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import javax.xml.ws.soap.MTOM;

public class Handler implements SOAPHandler<SOAPMessageContext>
{

/** Die CM_VERSION. */
public static final String CM_VERSION = "$Revision:$ $HeadURL:$";




/**
*
*/
public Handler()
{

}

/**
*
*/
@PostConstruct
protected void postConstruct()
{
System.out.println("Handler postConstruct");
}
@Override
public Set<QName> getHeaders()
{
System.out.println("getHeaders");
return Collections.emptySet();
}

@Override
public boolean handleMessage(SOAPMessageContext context)
{
System.out.println("Right api");
try
{
SOAPMessage msg = context.getMessage();
System.out.println("Content " + msg.getSOAPBody().toString());
}
catch (SOAPException e)
{
e.printStackTrace();
}
return true;
}

@Override
public boolean handleFault(SOAPMessageContext context)
{
System.out.println("handleFault");
return false;
}
@Override
public void close(MessageContext messageContext)
{
System.out.println("close Handler");
}


}[/CODE]
 
Zuletzt bearbeitet von einem Moderator:
Das Package stimmt nicht überein.

Ich würde Dir übrigens empfehlen, das Veröffentlichen von Dingen zu vermeiden, an denen man konkrete Firmen erkennen kann.
 
Ich würde mal sagen, Deine XML ist falsch. Lt. https://javaee.github.io/metro-jax-ws/doc/user-guide/ch03.html#section-404105458093083 müsste die im file-Attribut der @HandlerChain-Annotation angegebene XML-Datei so aussehen:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<jws:handler-chains xmlns:jws="http://java.sun.com/xml/ns/javaee">
    <jws:handler-chain>
        <jws:handler>
            <jws:handler-class>fromjava.handler_simple.common.TestHandler
            </jws:handler-class>
        </jws:handler>
    </jws:handler-chain>
</jws:handler-chains>
Kann sein, dass ich mich irre, weil ich da jetzt nicht weiter nachgesehen habe.
 
Zur Sicherheit probiere ich das noch mal aus, aber ich bilde mir ein es war eines meiner Versuche. Die namespace war bei mir javaee. In meinem Beispiel ist der default namespace auf javaee gesetzt.
 
Der Webservice funktioniert einwandfrei!!! Der Handler wurde im Nachhinein dran geklatscht, es scheint er wird nicht verwendet. Denn ich vermisse die obigen Debugausgaben und der Debugger springt nicht in die entsprechende Zeile!
 
OK, mal schnell getestet: funktioniert einwandfrei.

Code:
  simpletest3 was successfully deployed in 1.480 milliseconds.|#]
  Handled message|#]
  Hello|#]
  Handled message|#]

Ein Maven-Projekt, unter src/java/main/de/mihe7:

Java:
package de.mihe7;

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.ejb.Stateless;
import javax.jws.HandlerChain;

@WebService(serviceName = "TestService")
@Stateless()
@HandlerChain(file = "TestService_handler.xml")
public class TestService {

    @WebMethod(operationName = "hello")
    public String hello(@WebParam(name = "name") String txt) {
        System.out.println("Hello");
        return "Hello " + txt + " !";
    }
}
und der Handler

Java:
package de.mihe7;

import java.util.Collections;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class MyMessageHandler implements SOAPHandler<SOAPMessageContext> {
    
    public boolean handleMessage(SOAPMessageContext messageContext) {
        System.out.println("Handled message");
        SOAPMessage msg = messageContext.getMessage();
        return true;
    }
    
    public Set<QName> getHeaders() {
        return Collections.EMPTY_SET;
    }
    
    public boolean handleFault(SOAPMessageContext messageContext) {
        return true;
    }
    
    public void close(MessageContext context) {
    }
    
}

Die Klassen wurden von NetBeans erzeugt. Die XML-Datei auch:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-name>de.mihe7.MyMessageHandler</handler-name>
      <handler-class>de.mihe7.MyMessageHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

Allerdings hat NetBeans die Datei im falschen Verzeichnis abgelegt (unter src/main/java/...), musste ich nach src/main/resources/... verschieben, damit Maven die Datei auch ins WAR packt.
 
Es hat funktioniert, allerdings musste ich die handlers.xml in das Unterverzeichniss src/main/resources/defautlPackage/ packen. Dann wurde es gefunden.

Danke trotzdem.
 

Zurück
Oben