2011-07-13 12 views
2

私はアプリケーションにロギングアスペクトを実装しようとしています。私がAOPを試しているのは初めてのことなので、明らかに何か不足している場合は教えてください。外部ジャーを製織するために、私はロードタイムウィーバーを実装しようとしています。私は、アプリケーションのコンテキストでロードタイムウィーバーを指定し、aop.xmlとともに、context.xmlファイルにTomcatInstrumentableClassLoaderを記述しました。私のアプリケーションはSpring MVC RESTアプリケーションであり、JAXBコンテンツネゴシエーションも利用しています。アプリケーションの起動時に、JAXBは、前述のクラスからJAXBContextを構築する際に、NULLポインタ例外を伴ってエラーを出します。ただし、TomcatInstrumentableClassLoaderがなければ、JAXBContextは正常に初期化され、すべて正常に動作します。しかし、TomcatInstrumentableClassLoaderのロード時間なしでは、製織は機能しません。この問題を解決するためにできることはありますか?どんな助けでも大歓迎です。Spring AOPロギングインターセプタとJAXBの問題

マイアプリのコンテキスト:

.... 
    <aop:aspectj-autoproxy/> 
    <context:load-time-weaver aspectj-weaving="on" /> 
    ..... 
    <oxm:jaxb2-marshaller id="jaxb2Marshaller"> 
    <oxm:class-to-be-bound name="core.jaxb.DocPackage"/> 
    <oxm:class-to-be-bound name="core.jaxb.life.Life"/> 
    <oxm:class-to-be-bound name="core.jaxb.corr.Corr"/> 
    <oxm:class-to-be-bound name="core.jaxb.ps.PS"/> 
</oxm:jaxb2-marshaller> 

ここでは私のcontext.xmlです:

<?xml version="1.0" encoding="UTF-8"?> 
    <Context> 
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" useSystemClassLoaderAsParent="false"/> 
</Context> 

マイaop.xml:

 <!DOCTYPE aspectj PUBLIC 
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
    <aspectj> 
<weaver> 
    <!-- only weave classes in our application-specific packages --> 
    <include within="core.aspects.*"/> 
</weaver> 
<aspects> 
    <!-- weave in just this aspect -->   
    <aspect name="core.aspects.LoggerAspect"/> 
</aspects> 

ここでは、スタックトレースです:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jaxb2Marshaller': Invocation of init method failed; nested exception is java.lang.NullPointerException 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
... 23 more 
    Caused by: java.lang.NullPointerException 
at java.util.EnumMap.<init>(EnumMap.java:113) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeEnumLeafInfoImpl.<init>(RuntimeEnumLeafInfoImpl.java:72) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.createEnumLeafInfo(RuntimeModelBuilder.java:94) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.createEnumLeafInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:213) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:198) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:304) 
at com.sun.xml.internal.bind.v2.model.impl.SingleTypePropertyInfoImpl.getTarget(SingleTypePropertyInfoImpl.java:79) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeValuePropertyInfoImpl.getTarget(RuntimeValuePropertyInfoImpl.java:55) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeValuePropertyInfoImpl.getTarget(RuntimeValuePropertyInfoImpl.java:39) 
at com.sun.xml.internal.bind.v2.model.impl.SingleTypePropertyInfoImpl.ref(SingleTypePropertyInfoImpl.java:73) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeValuePropertyInfoImpl.ref(RuntimeValuePropertyInfoImpl.java:59) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeValuePropertyInfoImpl.ref(RuntimeValuePropertyInfoImpl.java:39) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:244) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:198) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:304) 
at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:81) 
at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:58) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:47) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:40) 
at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:63) 
at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:61) 
at java.util.AbstractList$Itr.next(AbstractList.java:345) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:244) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:89) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:198) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:84) 
at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:70) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:304) 
at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:319) 
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:430) 
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277) 
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100) 
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143) 
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) 
at javax.xml.bind.ContextFinder.find(ContextFinder.java:376) 
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
at org.springframework.oxm.jaxb.Jaxb2Marshaller.createJaxbContextFromClasses(Jaxb2Marshaller.java:372) 
at org.springframework.oxm.jaxb.Jaxb2Marshaller.getJaxbContext(Jaxb2Marshaller.java:331) 
at org.springframework.oxm.jaxb.Jaxb2Marshaller.afterPropertiesSet(Jaxb2Marshaller.java:317) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
... 33 more 

答えて

1

ロギングのための実装例ここで私は大成功に使用されてきた戦略です:

  1. は1つがそれ様相ますよう、後者はそれのSpring Bean
  2. 有効になり、AspectJの@Aspectアノテーション、春@Componentアノテーション付きの様相を作成します。 Speing AOP名前空間を設定してアプリのアスペクトを設定してから<aop:aspectj-autoproxy>
  3. @Aroundというアノテーションを付けたメソッドを作成し、ハンドラメソッドの実行前後で実行します。 @Around("execution(* com.mycontrollerpackage.(.*(..))")

今、あなたはに渡されたものから、あなたが要求に関する情報をログに記録することができ、メソッドの実行前と後に実行側面を持っている:そうは次のように、あなたのコントローラパッケージのクラスのみのために実行するメソッドを設定しますどのくらいかかりましたか。また、セキュリティチェックを実行し、ThreadLocal変数を実行の誘導などに設定することもできます。あらゆる種類の良いもの。

+0

ありがとうございました。同じことをやっています。私は、同じモジュールのアスペクトを実行する際に問題はありませんが、外部の瓶を織りようとすると、アプリケーションが複数のサブモジュールを使用していて、織り込まれていません。外部ジャーを織るには、TomcatInstrumentalbleClassLoaderを使う必要があります。これは私が上記の問題を抱えているときです。 –

+0

ここに別のスレッドがあります。受け入れられた答えは注釈を使用しないことに依存しているようですが、XMLの設定:http://stackoverflow.com/questions/5956490/why-spring-aop-is-not-weaving-external-jars-at-runtime – atrain

関連する問題