2017-08-17 3 views
0

LoggingAspectConfigurationクラスを追加する前に簡単なアプリケーションが正常に動作しています。次のようにソースコードは、(取り除かimport文)@Aspectの@Autowired依存関係注入はLoggerContextの場合nullです。

これは、これは、アプリケーション・ルート・クラスが存在componentscanさ

package com.rsa.tools.springmvc.configuration; 

public class ApplicationInitialization extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    protected Class<?>[] getRootConfigClasses() { 
    return new Class[] { ApplicationRootClassConfiguration.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
    return new Class[] { ApplicationWebConfiguration.class }; 
    } 

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

トップクラスである

package com.rsa.tools.springmvc.configuration.backend; 

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages={"com.rsa.tools.springmvc.configuration.general", "com.rsa.tools.springmvc.configuration.backend", "com.rsa.tools.springmvc.dao", "com.rsa.tools.springmvc.service"}) 
public class ApplicationRootClassConfiguration { 
} 

Logback構成

package com.rsa.tools.springmvc.configuration.general; 

@Configuration 
public class ApplicationLogbackConfiguration { 
    @Bean 
    public LoggerContext getLoggerContext() { ... } 
} 

ここまでうまく動作します。

私は以下のクラスを追加した後:loggerCtxの依存性の注入のために動作しませんでしたので、私は、nullポインタ例外を見始め

package com.rsa.tools.springmvc.configuration.general; 

@Aspect 
@Component 
public class LoggingAspectConfiguration { 
    @Autowired 
    LoggerContext loggerCtx; 

    @Pointcut("execution(* *.*(..))") 
    protected void loggingOperation() {} 

    @Before("loggingOperation()") 
    @Order(1) 
    public void logJoinPoint(JoinPoint joinPoint) { 
    Logger logger = loggerCtx.getLogger(this.getClass()); 
    logger.trace("Join point kind : " + joinPoint.getKind()); 
    logger.info("Signature declaring type : "+ joinPoint.getSignature().getDeclaringTypeName()); 
    logger.info("Signature name : " + joinPoint.getSignature().getName()); 
    logger.info("Arguments : " + Arrays.toString(joinPoint.getArgs())); 
    logger.info("Target class : "+ joinPoint.getTarget().getClass().getName()); 
    logger.info("This class : " + joinPoint.getThis().getClass().getName()); 
    } 
    ... 
} 

を。この問題に対処するには?

+0

'@ Order'は春からの注釈ですか?なぜあなたは 'logJoinPoint'メソッドでそれを持っていますか? –

+0

私はそれを削除しましたが、それと同じ問題です。 –

答えて

0

アスペクトはスプリングコンテナの外に作成されます。代わり成分としてLoggingAspectConfigurationを作成する

は、(コンフィギュレーション・クラスである)ApplicationLogbackConfigurationでBeanとして

を作成することを試みるタイプによってautowiresLoggerContext LoggerContext

@Bean 
public LoggingAspectConfiguration getLoggerContext(LoggerContext context) 
{ 
LoggingAspectConfiguration aspect = new LoggingAspectConfiguration(); 
aspect.setLoggerContext (context) 
return aspect; 
} 

Springコンテナ(用LoggingAspectConfiguration内部セッターメソッドを作成しますそのメソッドのパラメータに@Autowired注釈を付けることができます)。

+0

ここでは「a」とは何ですか? ApplicationLogbackConfiguration内に@Beanとして作成する場合、Aspectを指定する方法は?あなたはセッターメソッドを言った。コードサンプルはゲッターメソッド用です。私はここで何かを逃している。 –

+0

入力ミスが修正されました。私はアスペクトがコンテナの外にあり、loggercontextがスプリングビーンであると言っていたので、コンテナはそれがロードされるときにそのビーンがアスペクトであることをコンテナに知らせ、それによってloggercontextも設定します。 – surya

関連する問題