Maciej Nowicki

Maciej Nowicki Java Developer

Temat: Logowanie request/response w JAX-WS

Mam problem z logowaniem zawartości request i response do webservice'ów za pomocą JAX-WS. Niestety na konsolę (docelowo do loggera, ale to zrobię potem) trafia tylko pusty string:


<2012-04-11 12:07:48 CEST> <Error> <MyServiceImpl> <BEA-000000> <Invoking ws>
Request:


Response:


<2012-04-11 12:07:48 CEST> <Error> <MyServiceImpl> <BEA-000000> <got result: 3>


Środowisko to JDeveloper 11.1.1.4 + ADF, więc wszystko robiłem za pomocą tych kreatorów next-next-serxt-finish. Na pierwszy rzut oka wszystko wygląda dobrze:

Mój Handler:


public class RequestLoggingHandler implements SOAPHandler<SOAPMessageContext> {

private NonCatalogLogger logger = new NonCatalogLogger("RequestLog");

public static final String REQUEST = "Request:\n";
public static final String RESPONSE = "Response:\n";

private static PrintStream out = System.out;

public RequestLoggingHandler() {
super();
}

public Set<QName> getHeaders() {
return Collections.emptySet();
}

public boolean handleMessage(SOAPMessageContext context) {
try {

Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
String direction = outboundProperty ? REQUEST : RESPONSE;

SOAPMessage msg = context.getMessage();

out.println(direction);
msg.writeTo(out);
out.println("");

} catch (Exception e) {
throw new JAXRPCException(e);
}
return true;
}

public boolean handleFault(SOAPMessageContext context) {
return true;
}

public void close(javax.xml.ws.handler.MessageContext context) {
}
}


wygenerowany handler chain:


<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>RequestLoggingHandler</handler-name>
<handler-class>com.mypackage.RequestLoggingHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>


Handler chain dodany do klienta:


@WebServiceClient(wsdlLocation="http://myhost/MyService.svc?wsdl",
targetNamespace="http://tempuri.org/", name="MyService")
@HandlerChain(file="MyServiceProxy-HandlerChain.xml")
public class MyService


Co robię źle? Nie mam doświadczenia z handlerami, wcześniej logowanie obsługiwałem za pomocą features w CXF i działało mi bez problemów.

konto usunięte

Temat: Logowanie request/response w JAX-WS

A nie dasz rady tego w debugerze zatrzymać i obejrzeć sobie tego obiektu? Wiem, to oczywiste, ale to najlepsza metoda.

No i pamiętaj, że dla nietrywialnego requesta/response'a dostaniesz mime-encoded byte array, czyli wypisywanie go na stdout może być kiepskim pomysłem. Spróbuj wrzucić go do ByteArrayOutputStream a potem obejrzeć byte-dumpa.
Maciej Nowicki

Maciej Nowicki Java Developer

Temat: Logowanie request/response w JAX-WS

Bawiłem się debugerem - obiekty są puste.

Wypisywania do ByteArrayOutputStream też próbowałem - to samo, dostaję pusty string. Usunąłem to w wersji którą wrzuciłem tutaj dla większej czytelności, a także dlatego, że posiłkowałem się przykładem stąd: http://stackoverflow.com/questions/1945618/tracing-xml...

Na moje oko wygląda to tak jakby handler był wpięty gdzieś za wcześnie/niewłaściwie skonfigurowany, bo:

1) Odpala się przy request i response
2) Pomimo że na etapie handlera obiekty są puste, to komunikacja działa, dostaję sensowne wyniki, a tego handlera potrzebuję do audit-logu.

Następna dyskusja:

log4j i logowanie z jednego...




Wyślij zaproszenie do