Как я могу получить доступ к ApplicationContext из веб-службы JAX-WS? - PullRequest
9 голосов
/ 02 марта 2009

Аналогично Как я могу получить доступ к ServletContext из веб-службы JAX-WS? , есть ли способ получить доступ к applicationContext, проще, чем этот?

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.servlet.ServletContext;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

@WebService
public class MyWebService {
    // boilerplate code begins :(

    @Resource
    private WebServiceContext context;
    private WebApplicationContext webApplicationContext = null;

    /**
     * @return
     * @throws IllegalStateException
     */
    private WebApplicationContext getWebApplicationContext()
            throws IllegalStateException {
        if (webApplicationContext != null)
            return webApplicationContext;
        ServletContext servletContext =
                (ServletContext) context.getMessageContext().get(
                        MessageContext.SERVLET_CONTEXT);
        webApplicationContext =
                WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        return webApplicationContext;
    }
}

Ответы [ 5 ]

8 голосов
/ 03 декабря 2009
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;


@WebService( 
    endpointInterface = "Bla", 
    targetNamespace = "http://bla/v001", 
    wsdlLocation = "WEB-INF/wsdl/bla.wsdl",    
    serviceName = "BlaService",
    portName = "BlaPort")
public class BlaWs extends SpringBeanAutowiringSupport implements BlaPort {

  @Autowired
  @Qualifier("dao") 
  private Dao dao;
  ...
}
1 голос
/ 02 марта 2009

Я не думаю, что веб-сервис должен знать о веб-контексте или контексте сервлета или его контексте приложения. Я не понимаю, почему это должно знать что-либо из этого. Разве это не должно быть гораздо более пассивным? Введите то, что ему нужно, и дайте ему сделать свою работу. Взаимодействие службы с клиентом должно основываться на договоре, определенном заранее. Если он должен получить неизвестные значения из какого-либо контекста, как клиенты узнают, что нужно установить или как его установить?

Я бы пошел дальше и сказал, что веб-сервис должен быть оберткой для интерфейса сервиса Spring. Это просто еще один выбор среди всех возможных способов разоблачения. Ваш веб-сервис должен делать чуть больше, чем маршалировать и демаршировать объекты XML-запросов / ответов и сотрудничать со сервисами Spring.

1 голос
/ 20 августа 2009

Заставьте ваш компонент веб-службы расширять bean-компонент.

нравится это

0 голосов
/ 03 сентября 2014

Согласно JavaDoc для класса SpringBeanAutowiringSupport, см .: http://docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html

Прочитайте ПРИМЕЧАНИЕ: в конце Javadoc.

Исходный вопрос, на самом деле, может быть способом, которым это должно быть реализовано.

0 голосов
/ 02 марта 2009

Я бы установил Фильтр, который сохраняет ServletContext до объединения в ThreadLocal

...