2016-04-01 36 views
-1

webappをJavaの設定方法で読み込もうとしていました。 RAFTWebAppInitializerでは、私は最初に自家製のフレームワークと共に設定クラスを登録しました。しかし、春のセキュリティのフィルタチェーンがエラーをスローしています。AbstractSecurityWebApplicationInitializerが機能していません

public class RAFTWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
     public static final String SPRING_DISPATCHER_SERVLET_NAME = "raft"; 
     public static final String URL_PATTERN = "/"; 
     private static final String SPRING_FILTER_CHAIN_NAME = "springSecurityFilterChain"; 
     private static final String UNABLE_TO_REGISTER_FILTER_CHAIN = "Unable to register filter chain"; 


     private Logger logger = LogManager.getLogger(RAFTWebAppInitializer.class); 
     @Override 
     protected WebApplicationContext createRootApplicationContext() { 
      //initialize and register context 
      AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext(); 
      logger.info("Entering in root context to register chassis library"); 
/*Home grown framework */ 
      ABCInitializer abcInitializer = new ABCInitializer(); 
      abcInitializer .initialize(rootAppContext); 
      logger.info("Exiting after registering chassis library"); 

      rootAppContext.register(getRootConfigClasses());  
      logger.info("Exiting after registering App config classes");   
      //registerSpringFilterChain(rootAppContext.getServletContext(), URL_PATTERN + "*"); 

      return rootAppContext; 
     } 

     @Override 
     protected Class<?>[] getRootConfigClasses() { 
      logger.debug("Calling getRootConfigClasses..."); 

      return new Class[]{AppConfig.class,WebAppSecurityConfig.class}; 
     } 

     @Override 
     protected Class<?>[] getServletConfigClasses() { 
      logger.debug("Calling getServletConfigClasses..."); 

      return new Class[]{DispatcherConfiguration.class}; 
     } 

     @Override 
     protected String[] getServletMappings() { 
      return new String[]{URL_PATTERN}; 
     } 

     @Override 
     protected String getServletName() { 
      return SPRING_DISPATCHER_SERVLET_NAME; 
     } 
    } 

    @Configuration 
    @EnableWebSecurity 
    @ComponentScan(basePackages = { "com.capitalone.raft" }) 
    @Order(2) 
    public class WebAppSecurityConfig extends WebSecurityConfigurerAdapter { 
     private Logger logger = LogManager.getLogger(this.getClass()); 
    // Own implementation of different configs 
    } 

    public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 


     @Override 
     protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { 
      logger.info("Before spring security"); 


      // super.beforeSpringSecurityFilterChain(servletContext); 
     } 

     @Override 
     protected void afterSpringSecurityFilterChain(ServletContext servletContext) { 
      logger.info("After spring security"); 
      // super.afterSpringSecurityFilterChain(servletContext); 
     } 



     private Logger logger = LogManager.getLogger(this.getClass()); 
     private static final String FILTER_ENCODING_TYPE = "UTF-8"; 


    /* @Override 
     protected void afterSpringSecurityFilterChain(ServletContext servletContext) { 
      logger.info("afterSpringSecurityFilterChain gets called to register other filter"); 
      //super.afterSpringSecurityFilterChain(servletContext); 
      servletContext.addFilter("HttpMethodFilter", HiddenHttpMethodFilter.class); 
      CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(FILTER_ENCODING_TYPE, true); 
      servletContext.addFilter("CharacterEncodingFilter", characterEncodingFilter); 
      logger.info("afterSpringSecurityFilterChain completed to register other filters");  
     }*/ 

    } 

これら以外にも、サーブレットDispatcherConfiguration.classの構成クラスがあります。しかし、私はいつもエラーが発生しています 2016-04-01 14:05:37,237情報[localhost-startStop-1] context.ContextLoader(ContextLoader.java:347) - ルートWebApplicationContext:0 msで初期化完了 2016-04-フィルタの初期化 'springSecurityFilterChain' 01-Apr-2016 14:05:37.252 SEVERE [localhost-startStop-1] org .apache.catalina.core.StandardContext.startInternal 1つまたは複数のフィルタを開始できませんでした。詳細は、適切なコンテナログファイルに記載されています。 2016-04-01 14:05:37,252 INFO [AbstracthostContent.java: 01 14:05:35 EDT 2016]; 06:コンテキスト階層

容器ログに、 01年04月2016年12のルート17.359 SEVERE [ローカルホスト-startStop-1] org.apache.catalina.core.StandardContext.listenerStart例外リスナーにコンテキスト初期化イベントを送信しますorg.springframework.web.context.ContextLoaderListenerのインスタンス org.springframework.beans.factory.BeanCreationException: 'chassisConfig'という名前のBeanの作成中にエラーが発生しました:Beanのインスタンス化に失敗しました。ネストされた例外はorg.springframework.beans.BeanInstantiationExceptionです:[com.capitalone.raft.refapps.api.mvc.config.ChassisConfig $$ EnhancerBySpringCGLIB $$ 7e8af6fb]のインスタンス化に失敗しました:デフォルトコンストラクタが見つかりませんでした。ネストされた例外はjava.lang.NoSuchMethodExceptionです。com.capitalone.raft.refapps.api.mvc.config.ChassisConfig $$ EnhancerBySpringCGLIB $$ 7e8af6fb。() at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory .java:1105 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510でorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) で) ) (AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBeanでorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) で(AbstractBeanFactory.java:302)

できませんunderstansに、私は、サーバーの初期化をデバッグに行く際に、実際にこれらの二つのメソッドが呼び出されるので:

@Override 公共最終無効onStartup(のServletContextのServletContext) はServletExceptionが{ 場合(enableHttpSessionEventPublisher()){ servletContext.addListenerをスローします(HttpSessionEventPublisher。クラス); } insertSpringSecurityFilterChain(servletContext); afterSpringSecurityFilterChain(servletContext); }次に

プライベートボイドinsertSpringSecurityFilterChain(のServletContextのServletContext){ ストリングFILTERNAME = "springSecurityFilterChain"。 DelegatingFilterProxy springSecurityFilterChain =新しいDelegatingFilterProxy(filterName); 文字列contextAttribute = getWebApplicationContextAttribute(); if(contextAttribute!= null){ springSecurityFilterChain.setContextAttribute(contextAttribute); } registerFilter(servletContext、true、filterName、springSecurityFilterChain); }

答えて

0

私は自国のフレームワークでコンテキストクラスをブートストラップしているため、手動でコンテキストを更新する必要がありました。一度リフレッシュするとすべての問題が解決されました。しかし、コンポーネントスキャンを使用している間にそのことを覚えておいて、それをルートレベルで設定しようとする必要があります。しかし、その結果を理解する必要があるかもしれません。ルートパッケージをスキャンしているときに、コンフリクトを引き起こす可能性のあるクラスを追加登録することもできます(または特定のコンテキストとは無関係)。 更新されたコード:

public class RAFTWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    public static final String SPRING_DISPATCHER_SERVLET_NAME = "raft"; 
    public static final String URL_PATTERN = "/"; 
    private static final String SPRING_FILTER_CHAIN_NAME = "springSecurityFilterChain"; 
    private static final String UNABLE_TO_REGISTER_FILTER_CHAIN = "Unable to register filter chain"; 


    private Logger logger = LogManager.getLogger(RAFTWebAppInitializer.class); 
    @Override 
    protected WebApplicationContext createRootApplicationContext() { 
     //initialize and register context 
     AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext(); 
     logger.info("Entering in root context to register abc library"); 
     /*Home grown framework */ 
     ABCInitializer abcInitializer = new ABCInitializer(); 
     abcInitializer .initialize(rootAppContext); 
     logger.info("Exiting after registering chassis library"); 

     rootAppContext.register(getRootConfigClasses());  
     logger.info("Exiting after registering App config classes");   
     rootAppContext.refresh(); 

     return rootAppContext; 
     } 
関連する問題