2016-10-25 12 views
2

私は、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を使用しようとすると私の設定で何かが正しくないことを示しています(スタンドアロンサーブレットコンテナで実行できる戦争として自分のコードをパッケージ化する必要があるため、このイニシャライザを使用しました)。

ご意見/ご指摘ありがとうございます。

答えて

0

修正が見つかりました。リクエストに一致するようにURLパターンのようなantを使用する必要がありました:

registry.addInterceptor(dgvProxySvcRequestInterceptor()).addPathPatterns("/**"); 

私の元の設定はすべて良かったです。上記のURLパターン以外の変更は必要ありませんでした。

0
@Configuration 
@EnableWebMvc 
public class AppConfig extends WebMvcConfigurerAdapter { 
    // @Bean resolvers , etc 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 

     registry.addInterceptor(new DGVProxySvcRequestInterceptor()).addPathPatterns("/controller/action/*"); 
    } 
} 
+0

@EnableWebMvcを使用すると、Springの自動構成が使用できなくなると思います。自動設定を無効にすることなくインターセプタを追加する回避策はありませんか? – lbvirgo

+0

また、上記の提案を試してみてください。助けにならない。コントローラーが最初に呼び出され、次にインターセプターが呼び出されます。 – lbvirgo

+0

アクションURLを正しく置き換えましたか 'addPathPatterns' – kuhajeyan

0

私は同じ問題がありました。 @SpringBootApplicationは、現在のパッケージのすべてのコンポーネントのみをスキャンします。他のパッケージをスキャンするには、@ComponentScanにパッケージを指定する必要があります。

package com.main; 
@SpringBootApplication 
public class Application { 
    //Code goes here. 
} 

例については は、今私はインターセプタがある、登録になりたいどちらcom.mainないcom.main.**com.testパッケージで、使用可能なインチ

package com.test.interceptor 
@Configuration 
public class InterceptorConfig extends WebMvcConfigurerAdapter { 
    @Autowired 
    HeaderInterceptor headerInterceptor; 

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

上記の場合、Spring Bootは文脈でHeaderInterceptorを登録しません。登録するには、そのパッケージを明示的にスキャンする必要があります。

package com.main; 
@SpringBootApplication 
@ComponentScan("com.*") //Which takes care all the package which starts with com. 
@ComponentScan({"com.main.*","com.test.*"}) //For specific packages 
public class Application { 
    //Code goes here. 
} 
関連する問題