web-dev-qa-db-ja.com

Javaインターセプターが自動配線されたSpring Beanを使用しているSpringインターセプターの設定

Java config。の一部としてspring mvcインターセプターを追加したい。このためのxmlベースの構成をすでに持っているが、Java configインターセプターについては、春のドキュメントからこのようにできることを知っています。

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
    }

}

しかし、私のインターセプターは、次のように自動接続されたスプリングBeanを使用しています。

public class LocaleInterceptor extends HandlerInterceptorAdaptor {

    @Autowired
    ISomeService someService;

    ...
}

SomeServiceクラスは次のようになります。

@Service
public class SomeService implements ISomeService {

   ...
}

Beanのスキャンに@Serviceなどの注釈を使用していますが、構成クラスで@Beanとして指定していません

私の理解では、Java configはオブジェクトの作成にnewを使用するため、springは依存関係を自動的にオブジェクトに挿入しません。

Java configの一部としてこのようなインターセプターを追加するにはどうすればよいですか?

28
user3565529

以下を実行してください。

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    LocaleInterceptor localInterceptor() {
         return new LocalInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeInterceptor());
    }

}

もちろん、LocaleInterceptorの関連フィールドを取得するには、WebConfigをSpring Beanとしてどこかに設定する必要があります(XML、Java Configまたはアノテーションを使用))注入された。

SpringのMVC構成の一般的なカスタマイズに関するドキュメントは here にあります。特にインターセプターについては this セクションを参照してください。

48
geoand

次のように自分でオブジェクトの作成を処理する場合:

registry.addInterceptor(new LocaleInterceptor());

springコンテナがそのオブジェクトを管理する方法はないため、LocaleInterceptorに必要な注入を行います。

状況により便利な別の方法は、マネージ@Bean の中に @Configurationそして、次のようにメソッドを直接使用します。

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LocaleInterceptor localeInterceptor() {
        return new LocaleInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( localeInterceptor() );
    }
}
15
José Andias

サービスをコンストラクターパラメーターとして注入してみてください。簡単です。

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

   @Autowired
   ISomeService someService;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor(someService));
   }

}

次に、インターセプターを再構成し、

public class LocaleInterceptor extends HandlerInterceptorAdaptor {


     private final ISomeService someService;

     public LocaleInterceptor(ISomeService someService) {
         this.someService = someService;
     }


}

乾杯!

8
oko