動的に「サーブレットコンテキストパス」を取得できるようにしたい(例:http://localhost/myapp
またはhttp://www.mysite.com
)Service Spring BeanからのSpring Webアプリケーションの場合。
この理由は、Webサイトのユーザーに送信される電子メールでこの値を使用することです。
Spring MVCコントローラーからこれを行うのは非常に簡単ですが、Service Beanからこれを行うことはそれほど明白ではありません。
誰でもアドバイスできますか?
編集:追加要件:
アプリケーションの起動時にコンテキストパスを取得する方法がなく、すべてのサービスでいつでも取得できるようになっていないかどうか疑問に思っていました。
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());
}
}
Andreasが示唆したように、 ServletContext を使用できます。このように使用して、コンポーネントのプロパティを取得します。
@Value("#{servletContext.contextPath}")
private String servletContextPath;
サービス層からWeb層への依存関係を作成しないようにします。 request.getRequestURL()
を使用してコントローラーにパスを解決させ、これをサービスに直接渡します。
String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
サービスがコントローラーによってトリガーされる場合、コントローラーからHttpSerlvetRequestを使用してパスを取得し、サービスへの完全なパスを渡すことができると想定しています。
UIフローの一部である場合、任意のレイヤーで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);
}
}