私は、Tomcatの依存関係を持つwarとしてパッケージ化されたSpring-Bootアプリケーションを提供しています(私は両方のオプションを持っています。それはjava -jarコマンドを介して、またスタンドアロンのサーブレットコンテナでも実行できます)。Interceptorが初期化されず、SpringBootで呼び出されない
package com.mycompany.edsa.dgv.proxysvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@Component
public class DGVProxySvcRequestInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/* Put in the code here to validate user principal before passing control to the controller */
//BXPPrincipal principal = (BXPPrincipal)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//Map<String, ?> result = principal.getAttributes();
System.out.println("Inside DGVProxySvcRequestInterceptor...");
return super.preHandle(request, response, handler);
}
}
ただし、アプリケーションを起動するには(私はspring-boot:run
Mavenのゴールによって起動し、Eclipseを使用して:
は
package com.mycompany.edsa.dgv.proxysvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.mycompany.edsa.dgv.proxysvc.interceptor.DGVProxySvcRequestInterceptor;
//import com.mycompany.edsa.dgv.proxysvc.config.ConfigExtension;
@SpringBootApplication
@ImportResource("classpath:dgv-proxy-svc-spring-ctx.xml")
//@Import(ConfigExtension.class)
public class DGVProxySvcAppMain extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DGVProxySvcAppMain.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DGVProxySvcAppMain.class);
}
@Bean
public DGVProxySvcRequestInterceptor dgvProxySvcRequestInterceptor() {
DGVProxySvcRequestInterceptor dgvProxySvcReqInterceptor = new DGVProxySvcRequestInterceptor();
return dgvProxySvcReqInterceptor;
}
@Bean
public WebMvcConfigurerAdapter adapter() {
return new WebMvcConfigurerAdapter() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("Adding interceptors");
registry.addInterceptor(dgvProxySvcRequestInterceptor()).addPathPatterns("/*");
super.addInterceptors(registry);
}
};
}
}
下のマイインターセプタクラスは私のアプリのメインクラスです。 IDE)では、インターセプタがコンソールログに登録されることはありません。 私はデバッグモードでブレークポイントをpublic void addInterceptors(InterceptorRegistry registry)
メソッドで起動しようとしましたが、この時点でコントロールが来て、sysoutメッセージ"Adding interceptors"
がコンソールにログオンし、registry
にカプセル化されたArrayListに私のDGVProxySvcRequestInterceptor
が含まれています。このインターセプタBeanの初期化に関する何も言わないコンソール上のメッセージはありません。 さらに、私のサービスを呼び出す際に、インターセプタークラスのpreHandle
メソッド(インターセプターが呼び出されなかったことを確認する)に入れられたsysoutメッセージ"Inside DGVProxySvcRequestInterceptor..."
は表示されません。
誰かが私がやっているかもしれない設定ミスを見つけるのを手伝ってもらえますか?
Pls note - 私はの代わりにWebMvcConfigurerAdapter
でメインクラスを拡張し、addInterceptors
メソッドをオーバーライドしてインターセプタを追加しようとしました。その場合、私のインターセプタは初期化され(コンソールログで見ることができます)、私のサービスuriを呼び出すと呼び出されます。 これは、SpringBootServletInitializer
を使用しようとすると私の設定で何かが正しくないことを示しています(スタンドアロンサーブレットコンテナで実行できる戦争として自分のコードをパッケージ化する必要があるため、このイニシャライザを使用しました)。
ご意見/ご指摘ありがとうございます。
@EnableWebMvcを使用すると、Springの自動構成が使用できなくなると思います。自動設定を無効にすることなくインターセプタを追加する回避策はありませんか? – lbvirgo
また、上記の提案を試してみてください。助けにならない。コントローラーが最初に呼び出され、次にインターセプターが呼び出されます。 – lbvirgo
アクションURLを正しく置き換えましたか 'addPathPatterns' – kuhajeyan