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

StackOverflow https://stackoverflow.com/questions/602319

Вопрос

Похожий на Как я могу получить доступ к 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;
    }
}
Это было полезно?

Решение

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

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

Другие советы

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;
  ...
}

Сделайте компонент вашего веб-сервиса расширяющим компонент spring.

Нравится это

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

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

Прочтите ЗАПИСКУ:в конце javadoc.

Первоначальный вопрос, на самом деле, может заключаться в том, каким образом это должно быть реализовано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top