尝试使用 Jackson 加载配置时出现异常
Exception while trying to load configuration using Jackson
我正在尝试使用 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_TestAspecte74aa7(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_TestAspecte74aa7(TestAspect.aj:21)
at com.sun.proxy.$Proxy3.<clinit>(Unknown Source)
... 29 more
如果您能指出根本原因或推荐的调试技术,我将不胜感激。
亲切的问候,
纳达夫
编辑
请注意,我知道什么是空指针。我的问题是我从 ObjectMapper class 的实例中获取 NullPointerException,它是 Jackson 框架的一部分。
您的注释处理器正在重新进入自身。如果您从 main 向上查看堆栈跟踪,您会看到:
at io.demo.App.main(App.java:12)
at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspecte74aa7(TestAspect.aj:21)
at com.mytest.core.AppManager.getInstance(AppManager.java:61)
开始加载 Jackson
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 class 上的注释,所以这会回到反射并最终:
at sun.reflect.annotation.AnnotationParser.annotationForMap(AnnotationParser.java:239)
创建一个代理(注释的实现?),在 class 初始化期间尝试再次通过一个方面:
at com.sun.proxy.$Proxy3.<clinit>(Unknown Source)
at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspecte74aa7(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 class 初始化完成之前构造一个 ObjectMapper - 这并不奇怪,会导致错误。
我没有解决方案(因为我对 AspectJ 不够熟悉),但这是正在发生的事情的核心。可能类似于设置标志以指示配置是否 unloaded/loading/loaded,并避免在实际加载配置时尝试重新输入配置加载。
我正在尝试使用 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_TestAspecte74aa7(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_TestAspecte74aa7(TestAspect.aj:21)
at com.sun.proxy.$Proxy3.<clinit>(Unknown Source)
... 29 more
如果您能指出根本原因或推荐的调试技术,我将不胜感激。
亲切的问候,
纳达夫
编辑 请注意,我知道什么是空指针。我的问题是我从 ObjectMapper class 的实例中获取 NullPointerException,它是 Jackson 框架的一部分。
您的注释处理器正在重新进入自身。如果您从 main 向上查看堆栈跟踪,您会看到:
at io.demo.App.main(App.java:12)
at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspecte74aa7(TestAspect.aj:21)
at com.mytest.core.AppManager.getInstance(AppManager.java:61)
开始加载 Jackson
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 class 上的注释,所以这会回到反射并最终:
at sun.reflect.annotation.AnnotationParser.annotationForMap(AnnotationParser.java:239)
创建一个代理(注释的实现?),在 class 初始化期间尝试再次通过一个方面:
at com.sun.proxy.$Proxy3.<clinit>(Unknown Source)
at com.mytest.core.aspects.TestAspect.ajc$before$com_mytest_core_aspects_TestAspecte74aa7(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 class 初始化完成之前构造一个 ObjectMapper - 这并不奇怪,会导致错误。
我没有解决方案(因为我对 AspectJ 不够熟悉),但这是正在发生的事情的核心。可能类似于设置标志以指示配置是否 unloaded/loading/loaded,并避免在实际加载配置时尝试重新输入配置加载。