使用Servlet配置Spring Ioc

问题描述

在您的问题中

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

您不能使用spring容器实例化servlet,它们是由servlet容器实例化的。您只是在声明ProductServlet的另一个实例。

因此,当init()调用Servlet 方法时,您应该调用

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

要注入requestHelper @Autowired,请在Servlet中声明带注释的字段或属性

private RequestHelper requestHelper;

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

来自 processInjectionBasedOnServletContext javadoc:

处理 注射给定目标对象,根据与存储在ServletContext当前根web应用上下文。

解决方法

我是Spring的新手,想将spring 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>

而且我也有这样的Spring配置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>

我有这样的问题:

我希望在servlet init()期间将requestHelper对象设置为我的servlet。但除了这个,它还给了我nullpointer。

我正在尝试从实现servlet
HttpRequestHandler,将其写入SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,getServletContext());init()方法以及我在互联网上看到的其他东西,但所有这些都不能解决我的问题。

请帮我