/ / Une autre question sur Spring 3, servlet, @autowired - spring, servlets, source de données, autowired

Une autre question sur Spring 3, servlet, @autowired - spring, servlets, datasource, autowired

Je pense avoir lu toutes les questions et réponses sur Spring et automatiser le câblage d’un servlet, ici et sur springsource.org, et je ne peux toujours pas le faire fonctionner.

Tout ce que je veux, c'est que la source de données soit automatiquement définie dans mes servlets. Je comprends que le conteneur crée la servlet et non Spring.

Voici le code de mon servlet de test:

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

Dans mon applicationContext.xml, j'ai:

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

et dans mon datasource.xml:

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

Si je ne peux pas "fonctionner correctement, je vais simplement utiliser WebApplicationContextUtils dans la méthode init du servlet, mais je voudrais vraiment que cela fonctionne après toutes les lectures que j’ai faites."

J'utilise Spring 3, Java 1.6.

Merci,

Paul

Réponses:

1 pour la réponse № 1

Vous devez remplacer vos servlets par des contrôleurs Spring MVC. Parce que Spring n'injectera rien dans les classes (servlets) créées par quelqu'un d'autre, alors Spring lui-même (sauf @Configurable).

(Pour obtenir un exemple très simple, jetez un coup d’œil au projet de modèle de ressort STS: MVC).


0 pour la réponse № 2

Ce que je voulais faire, c’était d’obtenir une référence DataSource dans mon Servlet gratuitement, c’est-à-dire de ne pas appeler une méthode getDatasource statique sur une classe.

Voici ce que j'ai appris et comment je l'ai fait fonctionner:

Les servlets ne peuvent pas être configurés ou automatiquement câblés par Spring. Les servlets sont créés avant que le contexte de Spring ne soit chargé. Voir le problème SPR-7801: https://jira.springsource.org/browse/SPR-7801

Ce que j'ai fait est de créer un DataSource dans mon applicationContext.xml et de l'exporter en tant que propriété:

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

Dans la méthode init de mon servlet, j'ai lu la propriété:

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
}

Si j’utilisais des DAO au lieu de frapper lebase de données à partir des servlets, il aurait été facile de les connecter à @Autowired en les marquant @Configurable et à pouvoir utiliser @Transactional et d’autres produits Spring.