Извлечение пути контекста сервлета из веб-приложения Spring
Я бы хотел, чтобы динамически извлекал "путь контекста сервлета" (например, http://localhost/myapp
или http://www.mysite.com
) для моего веб-приложения spring из службы spring bean.
Причиной этого является то, что я хочу использовать это значение в письме, которое будет отправлено пользователям веб-сайта.
Хотя это довольно легко сделать с помощью контроллера spring MVC, это не так очевидно сделать из службы bean.
Кто-нибудь может посоветовать?
EDIT: дополнительное требование:
Мне было интересно, не было ли способ получения контекстного пути при запуске приложения и всегда ли он доступен для извлечения всех моих сервисов?
Ответы
Ответ 1
Если вы используете ServletContainer >= 2.5, вы можете использовать следующий код для получения 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());
}
}
Ответ 2
Как предложил Андреас, вы можете использовать ServletContext. Я использую его так, чтобы получить свойство в моих компонентах:
@Value("#{servletContext.contextPath}")
private String servletContextPath;
Ответ 3
Я бы не стал создавать зависимость от веб-уровня со своего уровня обслуживания. Попросите своего контроллера разрешить путь с помощью request.getRequestURL()
и передать его непосредственно службе:
String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
Ответ 4
Если служба запускается контроллером, который я предполагаю, вы можете получить путь с помощью HttpSerlvetRequest от контроллера и передать полный путь к службе.
Если это часть потока пользовательского интерфейса, вы можете фактически ввести HttpServletRequest
на любом уровне, это работает, потому что если вы вставляете в HttpServletRequest
, Spring фактически вводит прокси-сервер, который делегирует фактическое значение HttpServletRequest (по сохраняя ссылку в 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);
}
}