views:

24

answers:

1

Application configuration:

  • Web application using java first method of creating JAX-WS 2.0 Web Services with annotations.
  • WebLogic 10.3

My Requirements

The requirements I have are to deploy a single web service implementation class, but change logic based on the URL from which the service was accessed.

Question: I'm assuming a good way to do this is to deploy different mappings in web.xml and initialize them with different parameters. Is there a better way?

What is the best way to switch logic off the URL from which the web service was accessed? Should I try to configure two servlet mappings in web.xml with initialization parameters (tried, but couldn't get it to work), or should I parse the URL in the service impl? Any other alternatives?

What I've Tried (but didn't work)

I have tried adding the <init-param> in the <servlet> element in web.xml. However, can't get to the ServletConfig object inside the web service to retrieve the param. The web service does not have all the functionality of a standard Servlet (even if I implement Servlet or ServletContextListener). I only have access to the WebServiceContext (it seems) and from there I can only get <context-param> elements--but I would need <init-param> elements instead.

In web.xml, I enter two <servlet> elements using the same Java class, but which map to two different URLs as follows. Notice how the "source" param is different in each Servlet mapping.

<servlet>
    <servlet-name>Foo</servlet-name>
    <servlet-class>com.Foo</servlet-class>
    <init-param>
        <param-name>source</param-name>
   <param-value>1</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Foo</servlet-name>
    <url-pattern>/Foo</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>Bar</servlet-name>
    <servlet-class>com.Foo</servlet-class>
   <init-param>
        <param-name>source</param-name>
   <param-value>2</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Bar</servlet-name>
    <url-pattern>/Bar</url-pattern>
</servlet-mapping>  
+1  A: 

You very well may have, but did you try using MessageContext at runtime to determine what the source is?

@WebService
public class CalculatorService implements Calculator
{

    @Resource
    private WebServiceContext context;

    @WebMethod
    public void getCounter()
    {
        MessageContext mc = wsContext.getMessageContext();
        // you can grab the HttpSession
        HttpSession session = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
        // ...or maybe the path info is enough
        String path = mc.get(MessageContext.PATH_INFO);
        // the query itself should almost definitely be enough
        String query = (String) mc.get(MessageContext.QUERY_STRING);
    }

}

I got the idea from http://sirinsevinc.wordpress.com/category/jaxws/. Haven't tried it, though.

The Alchemist
This solution, or one similar, seems to be the only solution. I would go with adding this logic to a Soap Handler that executes in a chain in the inbound request (setting a parameter in the message at that point). Thanks for the thoughts. I was hoping this would be a simple configuration, but it looks like there will be more to it than that.
Steve
@Steve: Good luck!
The Alchemist