java - 使用 Servlet 配置 Spring Ioc

标签 java spring servlets

我是 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/

相关文章:

java - JFrame 中的自定义绘图不显示

java - 动态远程服务位置-如何用Spring注入(inject)?

java - 在Spring MVC中获取客户端机器的IP地址

java - GateIn:登录 servlet 的过滤器

java - 为什么在更新资源时在 URI 中有一个 id 参数?

jakarta-ee - EJB @Schedule 问题

java - 为什么 SpringSecurity 在注销后继续提供相同的经过身份验证的主体

java - javac 足以构建 OSGi 包吗?

java - 如何从 java 重新启动我的 tp-link 路由器

java - Spring Boot 2.1 中的 DataSource bean 覆盖