Еще один вопрос о Spring 3, сервлет, @autowired - PullRequest
2 голосов
/ 17 марта 2011

Я думаю, что прочитал все вопросы и ответы по Spring и по автоматическому подключению сервлета, как здесь, так и на springsource.org, и до сих пор не могу заставить его работать.

Все, что я хочу сделать, этоиметь источник данных, автоматически устанавливаемый в моих сервлетах.Я понимаю, что контейнер создает сервлет, а не Spring.

Вот код из моего тестового сервлета:

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" />

Если я не могу заставить это работать, я просто использую WebApplicationContextUtils в методе init сервлета, но я действительно хотел бы сделать эту работу после всехчтение я делал.

Я использую Spring 3, Java 1.6.

Спасибо,

Пол

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Вам необходимо заменить свои сервлеты на контроллеры Spring MVC.Поскольку Spring не будет ничего вставлять классы (сервлеты), созданные кем-то другим, тогда Spring itselfe (кроме @Configurable).

(Чтобы получить очень простой пример, взгляните на проект шаблона STS Spring: MVC).

0 голосов
/ 19 марта 2011

То, что я хотел сделать, это бесплатно получить ссылку на DataSource в моем сервлете, то есть не вызывать статический метод getDatasource для какого-либо класса.

Вот что я выучил и как я его получил:

Сервлеты не могут быть настроены или настроены автоматически Spring.Сервлеты создаются до загрузки контекста приложения Spring.См. Вопрос SPR-7801: https://jira.springsource.org/browse/SPR-7801

Я создал источник данных в моем applicationContext.xml и экспортировал его как свойство:

<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>

В методе 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 вместо обращения к базе данных из сервлетов, было бы легко подключить их к @Autowired, пометив их @Configurable, а также иметь возможностьиспользуйте @Transactional и другие весенние вкусности.

...