2

我想我已经阅读了关于 Spring 和自动装配 servlet 的所有问题和答案,在这里和 springsource.org 上,我仍然无法让它工作。

我要做的就是在我的 servlet 中自动设置数据源。我知道容器创建 servlet 而不是 Spring。

这是我的测试 servlet 中的代码:

package mypackage.servlets;

imports go here...

@Service
public class TestServlet extends HttpServlet
{
  private JdbcTemplate _jt;

  @Autowired
  public void setDataSource(DataSource dataSource)
  {
    _jt = new JdbcTemplate(dataSource);
  }

  etc etc

在我的 applicationContext.xml 我有:

<context:annotation-config />
<context:component-scan base-package="mypackage.servlets />
<import resource="datasource.xml" />

在我的 datasource.xml 中:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />

如果我不能让它工作,我只会在 servlet 的 init 方法中使用 WebApplicationContextUtils 但我真的很想在我一直在做的所有阅读之后让它工作。

我正在使用 Spring 3,Java 1.6。

谢谢,

保罗

4

2 回答 2

1

您需要用 Spring MVC 控制器替换您的 Servlet。因为 Spring 不会注入任何其他人创建的类(servlet)然后是 Spring 本身(@Configurable 除外)。

(要获得一个非常简单的示例,请查看 STS Spring 模板项目:MVC)。

于 2011-03-17T15:53:50.160 回答
0

我想做的是在我的 Servlet 中免费获得一个 DataSource 引用,即不在某个类上调用静态 getDatasource 方法。

这是我学到的东西以及我是如何工作的:

Spring 无法配置或自动装配 Servlet。Servlet 在 Spring 的应用上下文加载之前创建。请参阅问题 SPR-7801:https ://jira.springsource.org/browse/SPR-7801

我所做的是在我的 applicationContext.xml 中创建一个 DataSource 并将其导出为属性:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />
<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
  <property name="attributes">
    <map>
      <entry key="myDatasource">
        <ref bean="dataSource"/>
      </entry>
    </map>
  </property>
</bean>

在我的 servlet 的 init 方法中,我读取了属性:

public void init(ServletConfig config)
{
  Object obj = config.getServletContext().getAttribute("myDatasource");
  setDataSource((DataSource)obj);
}

public void setDataSource(DataSource datasource)
{
  // do something here with datasource, like 
  // store it or make a JdbcTemplate out of it
}

如果我一直在使用 DAO 而不是从 servlet 访问数据库,那么通过将它们标记为 @Configurable 来为 @Autowired 连接它们会很容易,并且还能够使用 @Transactional 和其他 Spring 好东西。

于 2011-03-18T21:01:59.967 回答