Как инициализировать веб-сервис Java EE 5 JAX-WS 2.0 с параметрами - PullRequest
1 голос
/ 02 сентября 2010

Конфигурация приложения:

  • Веб-приложение, использующее первый метод Java для создания веб-служб JAX-WS 2.0 с аннотациями.
  • WebLogic 10,3

Мои требования

Требования, которые у меня есть, - это развертывание одного класса реализации веб-службы, но изменение логики на основе URL-адреса, с которого был получен доступ к службе.

Вопрос: Я предполагаю, что хороший способ сделать это - развернуть различные сопоставления в файле web.xml и инициализировать их с разными параметрами. Есть ли лучший способ?

Как лучше всего отключить логику URL-адреса, с которого был получен доступ к веб-службе? Должен ли я попытаться настроить два сопоставления сервлета в web.xml с параметрами инициализации (пробовал, но не смог заставить его работать), или мне нужно разобрать URL в службе impl? Любые другие альтернативы?

Что я попробовал (но не сработало)

Я попытался добавить <init-param> в элемент <servlet> в web.xml. Однако не удается получить объект ServletConfig внутри веб-службы для получения параметра. Веб-сервис не обладает всеми функциональными возможностями стандарта Servlet (даже если я использую Servlet или ServletContextListener). У меня есть доступ только к WebServiceContext (кажется), и оттуда я могу получить только элементы <context-param>, но вместо этого мне понадобятся <init-param> элементы.

В web.xml я ввожу два элемента <servlet>, используя один и тот же класс Java, но который отображается на два разных URL-адреса следующим образом. Обратите внимание, как параметр «source» отличается в каждом отображении сервлета.

<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 Ответ

1 голос
/ 02 сентября 2010

Возможно, у вас все хорошо, но вы пытались использовать MessageContext во время выполнения, чтобы определить источник?

@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);
    }

}

Я получил идею от http://sirinsevinc.wordpress.com/category/jaxws/. Не пробовалэто все же.

...