# Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests



## Wiplash4 (13. Aug 2021)

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]


----------



## Barista (13. Aug 2021)

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.


----------



## Wiplash4 (14. Aug 2021)

Wurde bereinigt. Der Package scheint mir aber nicht das Problem.


----------



## mihe7 (14. Aug 2021)

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 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.


----------



## Wiplash4 (14. Aug 2021)

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.


----------



## Wiplash4 (15. Aug 2021)

Hat nicht funktioniert. Was koennte es sonst sein?


----------



## mihe7 (15. Aug 2021)

Funktioniert denn der WebService überhaupt? Was sagt das Log-File?


----------



## Wiplash4 (15. Aug 2021)

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!


----------



## mihe7 (15. Aug 2021)

Wenn ich nur Lust hätte, den SOAP-Käse auszuprobieren...


----------



## mihe7 (15. Aug 2021)

OK, mal schnell getestet: funktioniert einwandfrei. 


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

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


```
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


```
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 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.


----------



## Wiplash4 (16. Aug 2021)

Ich habe eine was.ear und keine war. Ist das ein Problem?


----------



## mihe7 (16. Aug 2021)

Wiplash4 hat gesagt.:


> Ich habe eine was.ear und keine war. Ist das ein Problem?


Das sollte keine Rolle spielen.


----------



## Wiplash4 (18. Aug 2021)

Es hat funktioniert, allerdings musste ich die handlers.xml in das Unterverzeichniss src/main/resources/defautlPackage/ packen. Dann wurde es gefunden.

Danke trotzdem.


----------



## mihe7 (18. Aug 2021)

Wiplash4 hat gesagt.:


> allerdings musste ich die handlers.xml in das Unterverzeichniss src/main/resources/defautlPackage/ packen.


Natürlich:


mihe7 hat gesagt.:


> musste ich nach src/main/resources/... verschieben, damit Maven die Datei auch ins WAR packt.


----------

