Java 17无法调用“java.lang.reflect.Method.invoke(Object, Object[])”,因为com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass为空。

21

我在使用Spring Boot和OAuth2的小项目中想要运行资源服务器。

环境设置:

  • Java 17
  • spring-boot-starter-parent版本为2.5.6
  • spring-cloud-dependencies版本为2020.0.4
  • spring-boot-starter-oauth2-resource-server
  • spring-security-oauth2-autoconfigure

当我想要运行应用程序时,出现了异常:


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "java.lang.reflect.Method.invoke(Object, Object[])" because "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" is null
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.12.jar:5.3.12]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.12.jar:5.3.12]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.12.jar:5.3.12]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.6.jar:2.5.6]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.6.jar:2.5.6]
    

你有任何想法可能出了什么问题吗?


7
defineClass 字段应该包含对一个 Method 对象的引用,而这个代码试图在该对象上调用方法 invoke(Object,Object ...),但该字段为 null。 这种情况的典型原因是在 catch(...) 后继续执行代码,而不是终止代码,导致该字段未初始化。 如果要进行更多猜测,此代码尝试通过反射访问 Unsafe.defineClass,但是 该方法不再存在,但它没有处理 NoSuchMethodException,继续执行并在稍后产生了 NullPointerException - Holger
2
最终,这对你来说并不重要,因为你不是Spring开发人员(我猜测),所以如果我的猜测正确,你必须升级框架(如果有更新版本)或降级Java(低于11)。 - Holger
@Holger,对此有什么想法吗?- https://stackoverflow.com/questions/72444442/java-lang-reflect-method-invokeobject-object-exception-trying-to-use-jaxb-o - Paul Taylor
3个回答

27

考虑将XML库添加到依赖项中,如下所示:

<dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>1.5.1</version>
    </dependency>

7
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它是如何回答问题的。你可以在帮助中心中找到有关如何撰写良好答案的更多信息。 - Community
3
我认为这个解决方案能够奏效是因为JAXB在Java 9中被标记为弃用,并在Java 11中被删除。如果您的项目中没有其他库(传递)提供依赖项,则在Java 17中无法找到它们。这就是为什么您需要将它们作为直接依赖项添加的原因。 11中删除了什么 - Vahid
目前,你应该使用这个依赖项: org.glassfish.jaxb jaxb-core 4.0.4 - undefined

9

只需要添加这个依赖项,错误就解决了:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>3.0.2</version>
</dependency>

感谢 @user

本测试使用以下环境:

  • JDK 17 (Eclipse Temurin)
  • Spring Boot 2.6.2
  • Spring Cloud 2021.0.0
  • org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure

4

maven-jaxb2-plugin 升级到版本0.15.1,问题就解决了。

 <plugin>
      <groupId>org.jvnet.jaxb2.maven2</groupId>
      <artifactId>maven-jaxb2-plugin</artifactId>
      <version>0.15.1</version>
 </plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接