Подтвердить что ты не робот

Извлечение пути контекста сервлета из веб-приложения Spring

Я бы хотел, чтобы динамически извлекал "путь контекста сервлета" (например, http://localhost/myapp или http://www.mysite.com) для моего веб-приложения spring из службы spring bean.

Причиной этого является то, что я хочу использовать это значение в письме, которое будет отправлено пользователям веб-сайта.

Хотя это довольно легко сделать с помощью контроллера spring MVC, это не так очевидно сделать из службы bean.

Кто-нибудь может посоветовать?

EDIT: дополнительное требование:

Мне было интересно, не было ли способ получения контекстного пути при запуске приложения и всегда ли он доступен для извлечения всех моих сервисов?

4b9b3361

Ответ 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);
 }
}