2016-11-03 3 views
3

Установки имеет следующий - у меня есть задержанное задание, которое будет отправлять сообщения электронной почты проверки, чтобы пользователи:Spring загрузки получить базовое приложение URL вне контекста сервлета

@Scheduled(cron = " 0 0-59/1 * * * * ") 
public void sendVerificationEmails() { 
    //... 
} 

И в этих письмах мне нужно включить ссылку, ведущую обратно к тому же webapp. Однако я не могу найти ссылки на то, как получить базовый url приложения без контекста сервлета.

БОНУС

Было бы полезно, если бы я мог настроить thymeleaf шаблон распознаватель здесь, чтобы работать с этими ссылками, но для этого мне нужен WebContext, который требует экземпляр HttpServletRequest.

+1

насчет файла свойств , Кстати, почему именно вы не хотите использовать контекст сервлета? – kuhajeyan

+0

http://stackoverflow.com/questions/20405474/spring-boot-context-root – developer

+0

@kuhajeyan, потому что это не веб-запрос, другая область. Как насчет файла свойств? – Benedictus

ответ

5

Предположим, ваше приложение использует встроенный сервер Tomcat, то URL-адрес для вашего приложения можно найти следующим образом:

@Inject 
private EmbeddedWebApplicationContext appContext; 

public String getBaseUrl() throws UnknownHostException { 
    Connector connector = ((TomcatEmbeddedServletContainer) appContext.getEmbeddedServletContainer()).getTomcat().getConnector(); 
    String scheme = connector.getScheme(); 
    String ip = InetAddress.getLocalHost().getHostAddress(); 
    int port = connector.getPort(); 
    String contextPath = appContext.getServletContext().getContextPath(); 
    return scheme + "://" + ip + ":" + port + contextPath; 
} 

Вот пример для встроенного сервера молы:

public String getBaseUrl() throws UnknownHostException { 
    ServerConnector connector = (ServerConnector) ((JettyEmbeddedServletContainer) appContext.getEmbeddedServletContainer()).getServer().getConnectors()[0]; 
    String scheme = connector.getDefaultProtocol().toLowerCase().contains("ssl") ? "https" : "http"; 
    String ip = InetAddress.getLocalHost().getHostAddress(); 
    int port = connector.getLocalPort(); 

    String contextPath = appContext.getServletContext().getContextPath(); 
    return scheme + "://" + ip + ":" + port + contextPath; 
} 
+0

Я не спрашиваю, как отправлять электронные письма или использовать шаблоны тимелеафа, что не имеет отношения к вопросу, и на самом деле, если вы внимательно прочитали вопрос, вы поймете, что я уже использую шаблоны тимелеафа и отправляю электронные письма. Реальный вопрос заключается в том, что приложение знает о его базовом URL-адресе и о том, как его получить, - и ваше решение должно предоставить его самому, что совсем не помогает (и это грубая практика со стороны развертывания). Кроме того, @ {} ссылки в тимелеафе не будут работать, если вы не сделаете контекст HTTP-оповещения с помощью «WebContext» – Benedictus

+0

. Вы правы, я полностью неправильно понял ваш вопрос, возможно, мой отредактированный ответ вы найдете более полезным. – eparvan

+0

Будет ли это работать при развертывании в другой контейнер веб-сервлетов? – Benedictus

2

В моей настройке у меня есть класс @Configuration, устанавливающий путь контекста (hardcoded) и @Value, вводящий номер порта из application.properties. Контекстный путь также может быть извлечена в файл свойств и вводили таким же образом, вы будете использовать:

@Value("${server.port}") 
private String serverPort; 
@Value("${server.contextPath}") 
private String contextPath; 

Вы также можете реализовать ServletContextAware в компоненте для того, чтобы получить крюк в ServletContext который также дало бы вам путь контекста.

Я предполагаю, что вы хотите отправить полный URL-адрес (включая полное имя сервера) в свои электронные письма, но вы не можете быть уверены, что получатели электронной почты обращаются к вашему серверу приложений напрямую по имени хоста, т. Е. это может быть за веб-сервером, прокси-сервером и т. д. Конечно, вы можете добавить имя сервера, которое, как вы знаете, можно получить извне как свойство.

+1

В новых версиях SpringBoot это '@Value (" $ {server.context-path} ")', но это хорошее решение, thx. –

Смежные вопросы