복붙노트

[SPRING] 서블릿으로 Spring Ioc 설정하기

SPRING

서블릿으로 Spring Ioc 설정하기

나는 봄에 새로 왔고 봄의 ioc를 내 작은 (테스트) 웹 앱에 연결하려고한다.

나는 그런 Servlet ProductServlet을 가지고있다 :

public class ProductServlet extends HttpServlet{
    private static final long serialVersionUID = 1L;
    private RequestHelper requestHelper;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request);
    }

    private void processRequest(HttpServletRequest request){
        requestHelper.process(request);
    }

    public RequestHelper getRequestHelper() {
        return requestHelper;
    }

    public void setRequestHelper(RequestHelper requestHelper) {
        this.requestHelper = requestHelper;
    }

}

및 내 web.xml :

  <servlet>
    <servlet-name>ProductServlet</servlet-name>
    <servlet-class>com.epam.productshop.controller.ProductShop</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ProductServlet</servlet-name>
    <url-pattern>/ProductServlet</url-pattern>
  </servlet-mapping>

     <listener>
      <listener-class>
        org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring-config.xml
        </param-value>
    </context-param>

또한 같은 봄 구성 xml 있습니다 :

<bean id="factory" class="com.epam.productshop.readerfactory.ReaderFactory">
    <property name="file" value="/xml/products.xml" />
</bean>

<bean id="requestHelper" class="com.epam.productshop.requesthelper.RequestHelper" scope="singleton">
    <property name="factory" ref="factory" />
</bean>

<bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
    <property name="requestHelper" ref="requestHelper"/>        
</bean>

나는 그런 문제가있다.

서블릿 init () 중에 Spring이 requestHelper 객체를 내 서블릿에 넣길 원합니다. 하지만이 대신에 그것은 나를 nullpointer 준다.

HttpRequestHandler에서 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext (this, getServletContext ())를 작성하여 내 서블릿을 구현하려고합니다. init () 메소드와 인터넷에서 볼 수있는 다른 것들에이 모든 것들이 내 문제를 해결하지 못한다.

도와주세요.

해결법

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

    1.귀하의 질문에 당신은

    귀하의 질문에 당신은

    <bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
        <property name="requestHelper" ref="requestHelper"/>        
    </bean>
    

    Spring 컨테이너로 서블릿을 인스턴스화 할 수 없으며 서블릿 컨테이너로 인스턴스화됩니다. ProductServlet의 다른 인스턴스를 선언하는 것일뿐입니다.

    따라서 Servlet init () 메서드가 호출 될 때 호출해야합니다.

    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());`
    

    requestHelper를 삽입하려면 @Autowired 주석 필드 또는 속성을 서블릿에 선언하십시오.

    private RequestHelper requestHelper;
    
    @Autowired
    public void setRequestHelper(RequestHelper requestHelper){
      this.requestHelper = requestHelper;
    }
    

    processInjectionBasedOnServletContext의 javadoc :

  2. ==============================

    2.다음은 해결 방법입니다.

    다음은 해결 방법입니다.

    public class ProductServlet extends HttpServlet
    {
        private static final long serialVersionUID = 1L;
        private RequestHelper requestHelper = null;
    
        private requestHelperInit(HttpServletRequest request)
        {
           if(requestHelper == null)
           {
              ApplicationContext ap = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
              requestHelper = ap.getBean(RequestHelper.class);
           }
        }
    }
    

    그런 다음 doGet () 또는 doPost () 메소드의 첫 번째 문으로 requestHelperInit (request) 메소드를 호출하십시오.

    솔루션을 계속 찾고 있다면, 이것이 도움이되기를 바랍니다.

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

    3.너는 몇 가지 선택권이있다. 실제로 서블릿을 삽입하고 싶다면, 서블릿 컨테이너가 이미 서블릿 생성을 담당하고있는 것이 문제입니다. 인젝션은 생성 시간이기 때문에이 서블릿을 생성하는 데 약간의 어려움이 있습니다. 덜 우아한 솔루션을 사용해야합니다. 그러나이 질문은 서블릿 주입 방법을 설명합니다.

    너는 몇 가지 선택권이있다. 실제로 서블릿을 삽입하고 싶다면, 서블릿 컨테이너가 이미 서블릿 생성을 담당하고있는 것이 문제입니다. 인젝션은 생성 시간이기 때문에이 서블릿을 생성하는 데 약간의 어려움이 있습니다. 덜 우아한 솔루션을 사용해야합니다. 그러나이 질문은 서블릿 주입 방법을 설명합니다.

    반면에이 방법을 중단하는 것을 고려해보십시오. 웹 애플리케이션을 실제로 작성하는 경우에는 서블릿 API에 직접 코딩하는 것이 일반적입니다. 서블릿 API 위에 앉아 많은 수준의 기능을 제공하는 많은 웹 애플리케이션 프레임 워크 중 하나를 선택하는 것은 어떻습니까? 이러한 프레임 워크가 Spring과의 편리한 통합을 제공하므로 코드를 쉽게 삽입 할 수 있다는 것이 장점입니다. 예를 들어, Struts 2에는 스프링을 사용하여 프레임 워크 인프라 구성 요소를 포함하여 프레임 워크에서 생성 된 모든 객체를 삽입하는 데 사용할 수있는 플러그인이 있습니다.

  4. from https://stackoverflow.com/questions/13461809/configurating-spring-ioc-with-servlets by cc-by-sa and MIT license