2

我正在更新使用 Spring 的现有 Java EE Web 应用程序。

在我的 web.xml 中,有一个 servlet 定义如下:

  <servlet>
    <display-name>My Example Servlet</display-name>
    <servlet-name>MyExampleServlet</servlet-name>
    <servlet-class>com.example.MyExampleServlet</servlet-class>
  </servlet>

现在,在这个类中我需要添加一个@Autowite 注释:

class MyExampleServlet extends HttpServlet {
    @Autowired (required = true)
    MyExampleBean myExampleBean;

    [...]
}

问题是 MyExampleBean 是由应用程序服务器初始化的(在我的例子中,weblogic.servlet.internal.WebComponentContributor.getNewInstance ...)

因此,Spring 没有意识到这一点,并且 Spring 没有机会连接“myExampleBean”。

如何解决?也就是说,我需要如何修改 web.xml 或 MyExampleServlet 以便 MyExampleServlet 获得对 myExampleBean 的引用?

一种可能是在 MyExampleServlet 中添加此初始化代码,但它需要对 servletContext 的引用。如何获取对 servletContext 的引用?

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
myExampleBean = (MyExampleBean) context.getBean("myExampleBean");
4

2 回答 2

2

我看到,HttpServlet/GenericServlet 有一个 getServletContext() 方法,(并且应用程序服务器首先调用 servlet 的 init(ServletConfig config),并且 config 包含对 servletContext 的引用)。

请参阅http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/GenericServlet.html

代码修改:

class MyExampleServlet extends HttpServlet {
    MyExampleBean myExampleBean;

    @Override
    public void init() throws ServletException {
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
        myExampleBean = (MyExampleBean) context.getBean("myExampleBean");
    }

    [...]
}
于 2012-04-13T14:25:26.810 回答
0

在您的应用程序上下文 xml 中,您需要类似

<bean id="myExampleBean" class="path/to/myExampleBean">
于 2012-04-13T13:42:45.377 回答