2015-11-14 33 views
0

我试图使用FasterXML Jackson-Databind为了从JSON文件加载配置。尝试使用Jackson加载配置时发生异常

我的应用程序使用AspectJ。方面J通过以下命令行开关加载:“-javaagent:target \ aspectjweaver-1.6.12.jar”。

当我尝试加载配置而不启动AspectJ时,一切正常。

当我尝试加载使用AspectJ的配置,我碰到下面的错误堆栈:

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at java.lang.reflect.Proxy.newInstance(Proxy.java:717) 
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:708) 
    at sun.reflect.annotation.AnnotationParser.annotationForMap(AnnotationParser.java:239) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:229) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52) 
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3079) 
    at java.lang.Class.getAnnotation(Class.java:3038) 
    at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:113) 
    at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:66) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:202) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69) 
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52) 
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3079) 
    at java.lang.Class.getAnnotation(Class.java:3038) 
    at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:170) 
    at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:261) 
    at com.mytest.core.ConfigurationManager.loadConfiguration(ConfigurationManager.java:44) 
    at com.mytest.core.ConfigurationManager.getOrLoadConfigurationData(ConfigurationManager.java:33) 
    at com.mytest.core.ApplicationContext.getConfigruation(ApplicationContext.java:51) 
    at com.mytest.core.services.FootprintsServiceClient.init(FootprintsServiceClient.java:43) 
    at com.mytest.core.AppManager.init(AppManager.java:43) 
    at com.mytest.core.AppManager.getInstance(AppManager.java:61) 
    at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspect$1$93e74aa7(TestAspect.aj:21) 
    at io.demo.App.main(App.java:12) 
Caused by: java.lang.NullPointerException 
     at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:530) 
     at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:448) 
     at com.mytest.core.ConfigurationManager.loadConfiguration(ConfigurationManager.java:44) 
     at com.mytest.core.ConfigurationManager.getOrLoadConfigurationData(ConfigurationManager.java:33) 
     at com.mytest.core.ApplicationContext.getConfigruation(ApplicationContext.java:51) 
     at com.mytest.core.services.FootprintsServiceClient.init(FootprintsServiceClient.java:43) 
     at com.mytest.core.AppManager.init(AppManager.java:43) 
     at com.mytest.core.AppManager.getInstance(AppManager.java:61) 
     at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspect$1$93e74aa7(TestAspect.aj:21) 
     at com.sun.proxy.$Proxy3.<clinit>(Unknown Source) 
     ... 29 more 

我会明白,如果你能指出我的根本原因或推荐的调试技术。

亲切的问候,

Nadav

编辑 请注意,我知道什么是空指针。我的问题是,我从ObjectMapper类的一个实例中获取NullPointerException,它是Jackson框架的一部分。

+0

我知道什么是空指针异常。问题在于它是由ObjectMapper引发的,它是Jackson框架的一部分。 – nadavy

+0

什么版本的杰克逊? –

+0

版本2.6.3。看起来像最新的.. – nadavy

回答

1

您的注释处理器正在重新进入。如果你通过从主要向上堆栈跟踪,你看:

at io.demo.App.main(App.java:12) 
at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspect$1$93e74aa7(TestAspect.aj:21) 
at com.mytest.core.AppManager.getInstance(AppManager.java:61) 

它开始加载杰克逊

at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:261) 
at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:170) 
at java.lang.Class.getAnnotation(Class.java:3038) 

VisibilityChecker线170具有静态intialisation加载的标准类注释,所以这可以追溯到到反射,最终:

at sun.reflect.annotation.AnnotationParser.annotationForMap(AnnotationParser.java:239) 

创建一个代理(实现注释的?),这在上课时初始化试图去通过一个asp再次ECT:

at com.sun.proxy.$Proxy3.<clinit>(Unknown Source) 
    at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspect$1$93e74aa7(TestAspect.aj:21) 
    at com.mytest.core.AppManager.getInstance(AppManager.java:61) 

,现在我们回到AppManager.getInstance 61行

at com.mytest.core.ConfigurationManager.loadConfiguration(ConfigurationManager.java:44) 
    at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:448) 

,这是试图构建一个ObjectMapper的ObjectMapper类初始化具有completed-这并不奇怪之前,导致错误。

我没有解决方案(因为我对AspectJ不够熟悉),但这是正在发生的事情的核心。可能是像设置一个标志来指示配置是否被卸载/加载/加载,以及避免在实际加载配置时尝试重新输入配置加载。

+0

谢谢 - 我昨天也注意到了。好的赶上! :) – nadavy

相关问题