40

Spring Web アプリケーションの "サーブレット コンテキスト パス" (または など) をService spring Beanから動的に取得できるようにしたいと考えています。http://localhost/myapphttp://www.mysite.com

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

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

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

編集:追加要件:

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

4

5 に答える 5

59

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());
    }
}
于 2013-02-26T07:57:13.380 に答える
6

サービス層から Web 層への依存関係を作成することは避けたいと思います。コントローラーを取得してパスを解決し、request.getRequestURL()これをサービスに直接渡します。

String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
于 2012-09-02T19:01:52.557 に答える
2

サービスがコントローラーによってトリガーされた場合、コントローラーから 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);
 }
}
于 2012-09-02T15:06:09.933 に答える