Extraire le chemin de contexte servlet d'une application Web de printemps

je voudrais pouvoir de manière dynamique récupérer le " servlet context path "(e.g. http://localhost/myapp or http://www.mysite.com ) pour mon application spring web à partir d'un service spring bean .

La raison pour cela est que je veux utiliser cette valeur dans les e-mails qui seront envoyés aux utilisateurs du site web.

alors qu'il serait assez facile de le faire à partir D'un ressort MVC contrôleur, il n'est pas si évident de faire cela à partir d'un haricot de Service.

est-ce que quelqu'un peut me conseiller?

modifier: exigence supplémentaire:

je me demandais s'il n'y avait pas un moyen de retrouver le chemin du contexte au démarrage de l'application et de le rendre disponible pour la récupération à tout moment par tous mes services?

28
demandé sur balteo 2012-09-02 18:04:45

4 réponses

si vous utilisez un ServletContainer > = 2.5, vous pouvez utiliser le code suivant pour obtenir le chemin de contexte:

import javax.servlet.ServletContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component

@Component
public class SpringBean {

    @Autowired
    private ServletContext servletContext;

    @PostConstruct
    public void showIt() {
        System.out.println(servletContext.getContextPath());
    }
}
33
répondu Andreas Berger 2013-02-26 07:57:13

comme Andreas l'a suggéré, vous pouvez utiliser le ServletContext . Je l'utilise comme ceci pour obtenir la propriété dans mes composants:

    @Value("#{servletContext.contextPath}")
    private String servletContextPath;
18
répondu stuchl4n3k 2015-12-14 09:13:09

j'éviterais de créer une dépendance à la couche web à partir de votre couche service. Obtenez votre contrôleur pour résoudre le chemin en utilisant request.getRequestURL() et passer directement au service:

String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
6
répondu Rich Cowin 2012-09-02 19:01:52

si le service est déclenché par un contrôleur, ce que je suppose qu'il est, vous pouvez récupérer le chemin en utilisant HttpSerlvetRequest à partir du contrôleur et passer le chemin complet au service.

si cela fait partie du flux D'UI, vous pouvez en fait injecter HttpServletRequest dans n'importe quelle couche, cela fonctionne parce que si vous injectez HttpServletRequest , le ressort injecte en fait un proxy qui délègue à la vraie HttpServletRequest (en gardant une référence dans un ThreadLocal ).

import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;

public class AServiceImpl implements AService{

 @Autowired private HttpServletRequest httpServletRequest;


 public String getAttribute(String name) {
  return (String)this.httpServletRequest.getAttribute(name);
 }
}
2
répondu Biju Kunjummen 2012-09-02 15:06:09