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?
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());
}
}
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;
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, ...);
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);
}
}