복붙노트

[SPRING] 왜 스프링 작업에서 GWT 서블릿의 필드를 autowiring하지 않는가?

SPRING

왜 스프링 작업에서 GWT 서블릿의 필드를 autowiring하지 않는가?

GWT 서블릿에서 @Autowired로 필드를 표시하는 것만으로 의도 한대로 작동하지 않습니다. 코드가 컴파일되고 웹 애플리케이션이 시작될 것입니다. 즉, Spring이 필드를 자동으로 autowire 할 수 있지만, 클라이언트 측 코드에 의해 실제로 서블릿이 눌려지면 NullPointerException이 발생합니다. 예를 들어, 초기화되지 않은 다른 사본이 있습니다. 서블릿이 맞았습니다.

웹에서이 작업을 수행하는 몇 가지 방법을 찾았습니다. 하나는 Spring 논리를 수행하는 기본 서블릿 클래스를 사용하지만 모든 GWT 서블릿이이 기본 클래스를 확장해야 함을 의미합니다. 다른 방법은 AspectJ와 @Configurable Spring annotation을 사용하는 것이다. 여기에 관련된 구성이 거의 없었으며 마술처럼 작동했습니다.

내 질문은 왜 필드를 autowiring 그냥 의도대로 작동하지 않는 이유는 무엇입니까? 이것이 깨지게하는 GWT는 무엇입니까?

해결법

  1. ==============================

    1.꼭 그런 것은 아닙니다. 웹 컨테이너는 Spring의 도움없이 서블릿을 인스턴스화 할 수 있습니다. 당신이 경험할 수있는 것 :

    꼭 그런 것은 아닙니다. 웹 컨테이너는 Spring의 도움없이 서블릿을 인스턴스화 할 수 있습니다. 당신이 경험할 수있는 것 :

    try override Servlet init () :

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    
        WebApplicationContextUtils.getWebApplicationContext(config.getServletContext())
            .getAutowireCapableBeanFactory().autowireBean(this);
    }
    
  2. ==============================

    2.RPC 서비스가 클라이언트에서 호출되면 호출 된 URL과 서블릿 매핑을보고있는 "서버 측"이 클래스를 찾고 인스턴스를 만들고 요청을 처리합니다. 의미는 @Autowired 어노테이션이 있거나, 당신이 이미 봄 문맥에서 RPC 클래스의 인스턴스를 가지고 있다면, 그것은 중요하지 않다. 새 인스턴스가 생성되고 Spring에 대해 "알지 못합니다".

    RPC 서비스가 클라이언트에서 호출되면 호출 된 URL과 서블릿 매핑을보고있는 "서버 측"이 클래스를 찾고 인스턴스를 만들고 요청을 처리합니다. 의미는 @Autowired 어노테이션이 있거나, 당신이 이미 봄 문맥에서 RPC 클래스의 인스턴스를 가지고 있다면, 그것은 중요하지 않다. 새 인스턴스가 생성되고 Spring에 대해 "알지 못합니다".

    RemoteServiceServlet을 확장하고 Controller (Spring MVC에서)와 ServletContextAware를 구현하는 클래스를 구현하여이 문제를 해결합니다. 이렇게하면 모든 RPC 서비스를 Spring MVC 접근 방식을 사용하여 URL별로 매핑 할 수 있습니다 (예 :

    <bean id="publicUrlMapping"
            class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
              <props>
                <prop key="/myFirstRpc">firstRpcServiceBeanRef</prop>
                <prop key="/mySecondRpc">secondRpcServiceRef</prop>
              </props>
            </property>
        </bean>
    

    또한 web.xml의 모든 단일 RPC 서블릿에 대한 선언을 피하고 맵핑은 깨끗하며 스프링 주입이 있습니다. 모든 RPC 호출을 처리 할 org.springframework.web.servlet.DispatcherServlet에 대한 web.xml에는 단 하나의 매핑 만 선언합니다.

    GWT RPC와 Spring MVC 컨트롤러 통합에 대한 설명과 함께 웹에 몇 가지 예제가있다.

    희망이 도움이 될 것입니다.

  3. ==============================

    3.적어도 Spring을 사용할 때, @Autowired를 사용할 수 있고 방대한 구성이나 기본 클래스를 포함하지 않도록이 작업을 수행하는 훨씬 간단한 방법이 있습니다. 주의 할 것은 AspectJ도 사용해야한다는 것이다. 다음은 GWT 서블릿에 필요한 것입니다.

    적어도 Spring을 사용할 때, @Autowired를 사용할 수 있고 방대한 구성이나 기본 클래스를 포함하지 않도록이 작업을 수행하는 훨씬 간단한 방법이 있습니다. 주의 할 것은 AspectJ도 사용해야한다는 것이다. 다음은 GWT 서블릿에 필요한 것입니다.

    @Configurable
    public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService
    {
      @Autowired
      private MyService service;
    
      // ...
    }
    

    그리고 Spring 설정에서 다음과 같은 사항을 확인하십시오 :

       <!-- enable autowiring and configuration of non-spring managed classes, requires AspectJ -->
       <context:spring-configured/>
    

    하나의 마지막 메모. GWT 애플리케이션 (및 GWT 서블릿)에서 Spring 보안을 사용하고 있다면, AspectJ 제직이 올바르게 수행되도록 올바른 모드를 정의해야한다. 즉, @Secured 주석 처리와 @Autowired processing) 필요합니다 :

       <!-- turn on spring security for method annotations with @Secured(...) -->
       <!-- the aspectj mode is required because we autowire spring services into GWT servlets and this
            is also done via aspectj. a server 500 error will occur if this is changed or removed. -->
       <security:global-method-security secured-annotations="enabled" mode="aspectj"/>
    
  4. from https://stackoverflow.com/questions/8933778/why-doesnt-just-autowiring-a-field-in-a-gwt-servlet-in-spring-work by cc-by-sa and MIT license