2009-01-21 6 views
24

Je veux écrire un servlet simple dans JBoss qui fera appel à une méthode sur un grain de printemps. Le but est de permettre à un utilisateur de lancer un travail interne en cliquant sur une URL.accès printemps haricots d'un servlet dans JBoss

Quelle est la meilleure façon de mettre la main sur une référence à mon grain de printemps dans le servlet?

services Web JBoss permettent d'injecter une WebServiceContext dans votre classe de service à l'aide d'une annotation @Resource. Y at-il quelque chose de comparable qui fonctionne dans les servlets simples? Un service Web pour résoudre ce problème particulier serait d'utiliser un marteau pour écraser une noix.

Répondre

31

Votre servlet peut utiliser WebApplicationContextUtils pour obtenir le contexte d'application, mais votre code de servlet aura une dépendance directe sur le Cadre de printemps.

Une autre solution est de configurer le contexte d'application pour exporter la fève de printemps dans le contexte de servlet comme un attribut:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter"> 
    <property name="attributes"> 
    <map> 
     <entry key="jobbie" value-ref="springifiedJobbie"/> 
    </map> 
    </property> 
</bean> 

Votre servlet peut récupérer le grain du contexte de servlet en utilisant

SpringifiedJobbie jobbie = (SpringifiedJobbie) getServletContext().getAttribute("jobbie"); 
+0

Nice, merci. –

+0

Quel est l'avantage de le faire de cette façon et de ne pas utiliser WebApplicationContextUtils? De toute façon, c'est lié au printemps. – Elliot

+5

Le mécanisme de remplissage de l'attribut de contexte de servlet ne doit pas être implémenté à l'aide de Spring. Un filtre ou une autre servlet qui s'exécute au démarrage peut remplir l'attribut de contexte de servlet. –

7

J'ai trouvé une façon de le faire:

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 
SpringifiedJobbie jobbie = (SpringifiedJobbie)context.getBean("springifiedJobbie"); 
58

Il est une façon beaucoup plus sophistiquée de le faire. Il y a SpringBeanAutowiringSupport l'intérieur org.springframework.web.context.support qui vous permet de construire quelque chose comme ceci:

public class MyServlet extends HttpServlet { 

    @Autowired 
    private MyService myService; 

    public void init(ServletConfig config) { 
    super.init(config); 
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, 
     config.getServletContext()); 
    } 
} 

Cela entraînera du printemps à rechercher le ApplicationContext lié à cette ServletContext (par exemple créé par ContextLoaderListener) et injectent les grains de printemps disponibles dans cette ApplicationContext.

+4

Spring 2.5.x devrait être SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); qui gère le reste automatiquement. Conseil génial btw. – Lajcik

+1

Si vous avez besoin d'accéder à l'un des ServletConfig, assurez-vous que vous appelez "super.init (config)" dans la méthode "init"; par exemple. public void init (config ServletConfig) { de super.init (config); SpringBeanAutowiringSupport.processInjectionBasedOnServletContext (ce qui, config.getServletContext()); } – tamsler

+0

Merci pour l'indice, bonne prise! –

Questions connexes