sirve - spring mvc jsp
Recuperación de la ruta de contexto del servlet desde una aplicación web Spring (4)
Como sugirió Andreas, puedes usar el ServletContext . Lo uso así para obtener la propiedad en mis componentes:
@Value("#{servletContext.contextPath}")
private String servletContextPath;
Me gustaría poder recuperar dinámicamente la " ruta de contexto del servlet " (p. Ej., http://localhost/myapp
o http://www.mysite.com
) para la aplicación web de primavera de un bean de primavera Service .
El motivo es que deseo utilizar este valor en el correo electrónico que se enviará a los usuarios del sitio web.
Si bien sería muy fácil hacerlo desde un controlador Spring MVC, no es tan obvio hacerlo desde un Bean Service.
¿Alguien puede por favor asesorar?
EDITAR: Requisito adicional:
Me preguntaba si no había una forma de recuperar la ruta de contexto al inicio de la aplicación y tenerla disponible para su recuperación en todo momento por todos mis servicios.
Evitaría crear una dependencia en la capa web desde su capa de servicio. Obtenga su controlador para resolver la ruta usando request.getRequestURL()
y páselo directamente al servicio:
String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
Si el servicio es activado por un controlador, lo que supongo es que puede recuperar la ruta usando HttpSerlvetRequest desde el controlador y pasar la ruta completa al servicio.
Si es parte del flujo de UI, puede inyectar en HttpServletRequest
en cualquier capa, funciona porque si lo inyecta en HttpServletRequest
, Spring realmente inyecta un proxy que delega en la HttpServletRequest real (manteniendo una referencia en 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);
}
}
Si usa ServletContainer> = 2.5, puede usar el siguiente código para obtener 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());
}
}