我是 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>
我有这样的问题:
我希望 spring 在 servlet init() 期间将 requestHelper 对象设置到我的 servlet 中。但不是这个,它给了我空指针。
我正在尝试从 HttpRequestHandler
实现我的 servlet,将 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());
写入 init() 方法和我需要的其他内容在互联网上看到,但所有这些都不能解决我的问题。
请帮帮我
最佳答案
在你的问题中你有
<bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
<property name="requestHelper" ref="requestHelper"/>
</bean>
你不能用 Spring 容器实例化 servlet,它们是由 servlet 容器实例化的。您只是在声明 ProductServlet 的另一个实例。
因此,当调用 Servlet init()
方法时,您应该调用
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());`
要注入(inject) requestHelper,请在您的 servlet 中声明一个带有 @Autowired
注释的字段或属性:
private RequestHelper requestHelper;
@Autowired
public void setRequestHelper(RequestHelper requestHelper){
this.requestHelper = requestHelper;
}
来自 processInjectionBasedOnServletContext javadoc:
Process @Autowired injection for the given target object, based on the current root web application context as stored in the ServletContext.
关于java - 使用 Servlet 配置 Spring Ioc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461809/