Spring 服务未注入到 Web Servlet 中

Kir*_*ett 1 spring servlets dependency-injection

我正在使用 Spring DI 并尝试在我的 servlet 中注入 Spring 服务。然而,它没有被注入并保留下来null,导致NullPointerException.

我的小服务程序:

@WebServlet(urlPatterns = {"/Register"}, displayName = "RegisterServlet")
public class RegisterServlet extends HttpServlet {

    @Autowired
    @Qualifier("registerServlet")
    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // ...
        customerService.save(customer); // Fail, because service is null.
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

我的 spring-controller.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="registerServlet" class="com.fishingstore.controller.RegisterServlet">
        <property name="customerService" ref="customerService"/>
    </bean>

</beans>
Run Code Online (Sandbox Code Playgroud)

我的客户 DAO 类:

@Repository
@Transactional
public class CustomerDAOImpl implements CustomerDAO {

    private SessionFactory sessionFactory;

    @Autowired
    @Qualifier("sessionFactory")
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我的客户服务课程:

@Service
public class CustomerServiceImpl implements CustomerService {

    @Autowired
    @Qualifier("customerService")
    private CustomerDAO customerDAO;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我的 spring-service.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="customerService" class="com.fishingstore.service.implementation.CustomerServiceImpl">
        <property name="customerDAO" ref="customerDAO"/>
    </bean>
</beans>
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?

Omk*_*kar 5

Servlets不受Spring容器管理。因此显然@Autowired该类中的任何注释都不会被处理。

Spring 在SpringBeanAutowiringSupport类中提供了两个静态方法
,可在 servlet 类中使用它们来启用Autowiring功能。

  1. processInjectionBasedOnCurrentContext(对象目标)
  2. processInjectionBasedOnServletContext(对象目标,ServletContext servletContext)

使用第一种方法的示例在这里,第二种方法的示例在这里

这两种方法背后的想法是重写该Servlet's init方法并启用 bean 的自动装配。

例如 -

@Override
    public void init(ServletConfig config) throws ServletException{
        super.init(config);
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

    }
Run Code Online (Sandbox Code Playgroud)

确保按照 @Reimeus答案中指出的正确自动连接 beans。