Searchable Wiki Title: How can I access the HttpServletRequest and HttpServletReponse from within my endpoint?
By implementing the 'javax.xml.rpc.server.ServiceLifecycle' interface the endpoint will have a 'javax.xml.rpc.server.ServletEndpointContext' object passed into the init method before the business method of the endpoint is invoked.
The 'javax.xml.rpc.server.ServletEndpointContext' can be used to get the 'javax.xml.rpc.handler.MessageContext' which has a getProperty method that can be used to get certain properties.
The following properties are available by default with JBossWS: -
javax.xml.ws.servlet.context for javax.servlet.ServletContext
javax.xml.ws.servlet.request for javax.servlet.http.HttpServletRequest
javax.xml.ws.servlet.response for javax.servlet.http.HttpServletResponse
javax.xml.ws.servlet.session for javax.servlet.http.HttpSession
See the following endpoint example: -
package org.jboss.support.ws.phonebook;
import java.rmi.RemoteException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.server.ServiceLifecycle;
import javax.xml.rpc.server.ServletEndpointContext;
public class PhoneBookImpl implements PhoneBook, ServiceLifecycle
{
private ServletEndpointContext ctx;
public void init(final Object ctx) throws ServiceException
{
if (ctx instanceof ServletEndpointContext)
{
this.ctx = (ServletEndpointContext) ctx;
}
else
{
throw new ServiceException("Object passed into init is not a 'ServletEndpointContext'");
}
}
public void destroy()
{
}
public TelephoneNumber lookup(Person person) throws RemoteException
{
MessageContext msgCtx = ctx.getMessageContext();
HttpServletRequest request = (HttpServletRequest) msgCtx.getProperty("javax.xml.ws.servlet.request");
HttpServletResponse response = (HttpServletResponse) msgCtx.getProperty("javax.xml.ws.servlet.response");
System.out.println("Called from - " + request.getRemoteAddr());
TelephoneNumber tn = new TelephoneNumber();
tn.setAreaCode("01234");
tn.setNumber("567890");
return tn;
}
}
Comments