web-dev-qa-db-fra.com

Récupération du chemin de contexte du servlet à partir d'une application Web Spring

Je voudrais pouvoir dynamiquement récupérer le " chemin du contexte de servlet " (par exemple http://localhost/myapp ou http://www.mysite.com) pour mon application Web Spring à partir d'un Service Spring Bean.

La raison en est que je souhaite utiliser cette valeur dans les e-mails qui seront envoyés aux utilisateurs du site Web.

Bien qu'il soit assez facile de le faire à partir d'un contrôleur Spring MVC, il n'est pas si évident de le faire à partir d'un bean Service.

Quelqu'un peut-il s'il vous plaît conseiller?

EDIT: Exigence supplémentaire:

Je me demandais s'il n'y avait pas n moyen de récupérer le chemin du contexte au démarrage de l'application et de l'avoir disponible à tout moment pour tous mes services?

30
balteo

Si vous utilisez un ServletContainer> = 2.5, vous pouvez utiliser le code suivant pour obtenir le ContextPath:

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());
    }
}
38
Andreas Berger

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

    @Value("#{servletContext.contextPath}")
    private String servletContextPath;
23
stuchl4n3k

J'éviterais de créer une dépendance sur la couche Web à partir de votre couche de service. Demandez à votre contrôleur de résoudre le chemin à l'aide de request.getRequestURL() et transmettez-le directement au service:

String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
6
Rich Cowin

Si le service est déclenché par un contrôleur, ce que je suppose, vous pouvez récupérer le chemin à l'aide de HttpSerlvetRequest à partir du contrôleur et passer le chemin complet au service.

S'il fait partie du flux d'interface utilisateur, vous pouvez réellement injecter dans HttpServletRequest dans n'importe quelle couche, cela fonctionne parce que si vous injectez dans HttpServletRequest, Spring injecte en fait un proxy qui délègue à la HttpServletRequest réelle ( 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
Biju Kunjummen