web-dev-qa-db-ja.com

Spring Webアプリケーションからサーブレットコンテキストパスを取得する

動的にサーブレットコンテキストパス」を取得できるようにしたい(例:http://localhost/myappまたはhttp://www.mysite.comService Spring BeanからのSpring Webアプリケーションの場合。

この理由は、Webサイトのユーザーに送信される電子メールでこの値を使用することです。

Spring MVCコントローラーからこれを行うのは非常に簡単ですが、Service Beanからこれを行うことはそれほど明白ではありません。

誰でもアドバイスできますか?

編集:追加要件:

アプリケーションの起動時にコンテキストパスを取得する方法がなく、すべてのサービスでいつでも取得できるようになっていないかどうか疑問に思っていました。

30
balteo

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());
    }
}
38
Andreas Berger

Andreasが示唆したように、 ServletContext を使用できます。このように使用して、コンポーネントのプロパティを取得します。

    @Value("#{servletContext.contextPath}")
    private String servletContextPath;
23
stuchl4n3k

サービス層からWeb層への依存関係を作成しないようにします。 request.getRequestURL()を使用してコントローラーにパスを解決させ、これをサービスに直接渡します。

String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
6
Rich Cowin

サービスがコントローラーによってトリガーされる場合、コントローラーから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);
 }
}
2
Biju Kunjummen