Spring在ServletContextAware bean中设置WebApplicationContext

发布于 2024-10-20 05:36:36 字数 1835 浏览 1 评论 0原文

我正在将现有代码转换为 Spring 3 JDBC。我已将其放入实现 ServletContextAware 的类(SpringDB.Users)中。在setServletContext()中,以下代码不起作用:

public void setServletContext(ServletContext sc)
{
    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
    simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
}

原因是:异常是java.lang.IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener?

不过,我确实在 web.xml 中注册了一个 ContextLoaderListener:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

applicationContext.xml 有这样的内容:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql"/>
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
    <constructor-arg>
        <ref bean="dataSource"/>
    </constructor-arg>
</bean>
<bean class="SpringDB.Users"/>

这会导致调用 setServletContext()。 SpringDB.Users 类主要是静态的东西。它永远不会被 java 代码实例化。

显然,对 WebApplicationContextUtils.getRequiredWebApplicationContext() 的调用“为时过早”。因为没有任何麻烦的工作是稍后获取 WebApplicationContext,即当数据库工作真正开始时 - 所以我所做的是调用私有函数 getSimpleJdbcTemplate() 而不是私有变量 simpleJdbcTemplate:

static private SimpleJdbcTemplate getSimpleJdbcTemplate ()
{
    if (simpleJdbcTemplate == null)
    {
        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
    }
    return simpleJdbcTemplate;
}

有没有任何解决方案可以使变量 simpleJdbcTemplate 可以在 setServletContext() 中初始化吗?

我是否错过了一些明显的事情,或者只是期望太多?

I'm converting existing code to Spring 3 JDBC. I've put it into a class (SpringDB.Users) that implements ServletContextAware. In setServletContext(), the following code doesn't work:

public void setServletContext(ServletContext sc)
{
    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
    simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
}

The reason is: exception is java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?

However I did register a ContextLoaderListener in web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

The applicationContext.xml has this:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mysql"/>
<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
    <constructor-arg>
        <ref bean="dataSource"/>
    </constructor-arg>
</bean>
<bean class="SpringDB.Users"/>

which results in getting the call to setServletContext(). The class SpringDB.Users is mostly static stuff. It is never instantiated by the java code.

Apparently, the call to WebApplicationContextUtils.getRequiredWebApplicationContext() is "too early". Because what does work without any trouble is to get the WebApplicationContext at a later time, i.e. when database work really starts - so what I do is to call a private function getSimpleJdbcTemplate() instead of a private variable simpleJdbcTemplate:

static private SimpleJdbcTemplate getSimpleJdbcTemplate ()
{
    if (simpleJdbcTemplate == null)
    {
        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        simpleJdbcTemplate = (SimpleJdbcTemplate) wac.getBean("simpleJdbcTemplate");
    }
    return simpleJdbcTemplate;
}

Is there any solution so that the variable simpleJdbcTemplate can be initialized within setServletContext() ?

Am I missing something obvious, or just expecting too much?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅笑依然 2024-10-27 05:36:36

首先为什么需要它?

如果您的类是一个 bean,那么您可以简单地注入(使用 @Inject、@Autowired 或 xml)jdbc 模板:

@Inject
private SimpleJdbcTemplate template;

Why do you need that in the first place?

If your class is a bean, then you can simply inject (with @Inject, @Autowired or xml) the jdbc template:

@Inject
private SimpleJdbcTemplate template;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文