使用Jackson

时间:2015-11-14 09:51:14

标签: java jackson aspectj

我尝试使用FasterXML Jackson-Databind从JSON文件加载配置。

我的应用程序使用AspectJ。 Aspect 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框架的一部分。

1 个答案:

答案 0 :(得分: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行有一个静态初始化来加载Std类上的注释,所以这会反过来反思并最终:

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

创建一个代理(注释的实现?),在类初始化期间尝试再次通过一个方面:

    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 - 这不足为奇,会导致错误。

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