1

次のクラスのサービスによって作成されている Bean があります。

@Configuration
public class AccessManager {

    @Bean(name="access", destroyMethod="destroy")
    @Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
    @Autowired
    public Access create(HttpServletRequest request) {
        System.out.println(request.getRemoteAddr());
        return new Access();
    }

}

アプリケーションの起動時にこのメソッドが呼び出されることを除いて、すべてが期待どおりに機能します。おそらく、Bean を使用する他のシングルトン Bean があるためAccessです。起動時にはスレッドにバインドされたリクエストはなくjava.lang.IllegalStateException、パラメータのプロパティにアクセスしようとするとを取得することが期待されrequestます。

問題ない。問題はHttpServletRequestプロキシの基礎が例外を発生させるプロパティを呼び出す前にあるかどうかを確認することは可能ですか?requestnull

4

2 に答える 2

1

ここでの問題は、関心の分離にあると思います。通常、サービス レイヤーはサーブレット クラスに依存するべきではありません。これは、コントローラー/UI の問題です。

サービス クラスには、ジョブを実行するために必要なプロパティを提供する必要があります。この場合は文字列です。このサービス メソッドは、サーブレット リクエストで注入されるコントローラー メソッドから呼び出す必要があります。

次のようなもの:

@Controller
public class MyController {

  @Autowired
  private AccessManager accessManager;


  @RequestMapping
  public void handleRequest(HttpServletRequest request) {
    accessManager.create(request.getRemoteAddr());
  }
}

サービスは次のようになります。

@Service
public class AccessManager {

  public Access create(String remoteAddress) {
    return new Access();
  }
}

要約すると、 @Service として注釈が付けられたものは、リクエストにアクセスできません。

于 2012-08-17T19:27:16.343 に答える