Rhino208Write client-side SOAP handler that outputs raw xml for both request and response. Use Rhino script engine for Java to execute simple math calculation in your web method.

 

 

 

 

Example Solution

Service Implementation Bean

package com.fuzilaga.jws.rhino;

import javax.jws.WebService;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

@WebService(endpointInterface = "com.fuzilaga.jws.rhino.RhinoService")
public class RhinoServiceImpl implements RhinoService
{

	@Override
	public float calc(String expr) throws Exception
	{
		if (!expr.matches("[0-9+-/)\\(.\\*]*"))
		{
			throw new IllegalArgumentException();
		}

		float result = 0;

		ScriptEngineManager mgr = new ScriptEngineManager();
		ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
		result = Float.parseFloat(jsEngine.eval(expr).toString());

		return result;
	}

}

Handler

package com.fuzilaga.jws.rhino;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class RhinoClientHandler implements SOAPHandler<SOAPMessageContext>
{

	@Override
	public Set<QName> getHeaders()
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void close(MessageContext arg0)
	{
		// TODO Auto-generated method stub

	}

	@Override
	public boolean handleFault(SOAPMessageContext context)
	{
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean handleMessage(SOAPMessageContext context)
	{
		boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
		if (isRequest)
		{
			System.out.println("\nREQUEST:");
		}
		else
		{
			System.out.println("\nRESPONSE:");
		}
		try
		{
			context.getMessage().writeTo(System.out);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return true;
	}

}

Service Client

package com.fuzilaga.jws.rhino;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import com.fuzilaga.jws.rhino.client.RhinoService;
import com.fuzilaga.jws.rhino.client.RhinoServiceImplService;

public class RhinoClient
{
	public static void main(String args[])
	{
		RhinoServiceImplService service = new RhinoServiceImplService();
		service.setHandlerResolver(new HandlerResolver()
		{
			@Override
			public List<Handler> getHandlerChain(PortInfo portInfo)
			{
				List<Handler> handlers = new ArrayList<Handler>();
				handlers.add(new RhinoClientHandler());
				return handlers;
			}
		});
		RhinoService port = service.getRhinoServiceImplPort();
		try
		{
			float result = port.calc("12+30");
			System.out.println("\nresult="+result);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

The result output is:

REQUEST:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:calc xmlns:ns2="http://rhino.jws.fuzilaga.com/"><arg0>12+30</arg0></ns2:calc></S:Body></S:Envelope>
RESPONSE:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:calcResponse xmlns:ns2="http://rhino.jws.fuzilaga.com/"><return>42.0</return></ns2:calcResponse></S:Body></S:Envelope>
result=42.0

NOTE: Full source and instructions on how to run locally can be found here.