I have a servlet that also consumes SOAP WS (in doGet). I want to see SOAP envelope (or anything else in soap message). I adddd this code to my servlet class:
class ClientHandlerResolver implements HandlerResolver {
public List<Handler> getHandlerChain(PortInfo port_info) {
List<Handler> hchain = new ArrayList<Handler>();
hchain.add(new TestHandler()); // soap handler defined in TestHandler.java dumps messages to stdout
return hchain;
}
}
I a separate class, i have my TestHandler:
public class TestHandler implements SOAPHandler<SOAPMessageContext> {
private static final String LoggerName = "ClientSideLogger";
private Logger logger;
private final boolean log_p = true; // set to false to turn off
public TestHandler() {
logger = Logger.getLogger(LoggerName);
}
public boolean handleMessage(SOAPMessageContext ctx) {
if (log_p)
logger.info("Test::handleMessage");
// Is this an outbound message, i.e., a request?
Boolean request_p = (Boolean)
ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
// Manipulate the SOAP only if it's a request
if (request_p) {
try {
SOAPMessage msg = ctx.getMessage();
msg.writeTo(System.out);
}
catch(SOAPException e)
{ System.err.println(e);
}
catch(IOException e)
{ System.err.println(e);
}
}
return true; // continue down the chain
}
public boolean handleFault(SOAPMessageContext ctx) {
return true;
}
public Set<QName> getHeaders() {
if (log_p)
logger.info("getHeaders");
return null;
}
public void close(MessageContext messageContext) {
if (log_p)
logger.info("close");
}
}
Nothing is printed out when i make WS request. I don't even know if handler is called.
How to see printouts defined in Handler?
I'm not sure what Eclipse is generating for you, but here's one way to do it. Assume MyService
is the interface generated from the WSDL:
URL wsdlURL = new URL("...");
QName serviceName = new QName("...", "...");
Service service = Service.create(wsdlURL, serviceName);
HandlerResolver handlerResolver = new ClientHandlerResolver();
service.setHandlerResolver(handlerResolver);
MyService myService = service.getPort(MyService.class);
// invoke methods (operations) on myService