Spring的@Resource获取bean对象报错:java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang

本文介绍了在使用@Resource注解时遇到的NoSuchMethodError错误及其解决方案。错误发生在依赖注入过程中,原因是缺少必要的javax.annotation-api jar包。文中给出了正确的依赖配置。

【1】今天写项目的时候突然碰到了一个错,之前本来是通过@Autowired注解获取对象的,然是后来我改成了@Resource注解就开始报错了

严重: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@6e0e048a] to prepare test instance [com.kkb.spring.test.TestSpringIoC2@76b1e9b8]
java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.<init>(CommonAnnotationBeanPostProcessor.java:609)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.lambda$buildResourceMetadata$0(CommonAnnotationBeanPostProcessor.java:373)
    at org.springframework.util.ReflectionUtils.doWithLocalFields(ReflectionUtils.java:692)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.buildResourceMetadata(CommonAnnotationBeanPostProcessor.java:355)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.findResourceMetadata(CommonAnnotationBeanPostProcessor.java:339)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:316)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1350)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:401)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

【2】后来上网一查才知道,是少了一个配置的jar包,并且了解到JDK1.8之后就不主动支持@Resource了,必须自己手动倒jar包

        

<dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
        </dependency>

        

### Java中`NoSuchMethodError`错误解决方案 当遇到 `java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()` 错误时,通常是因为运行环境中使用的类库版本不一致或者存在冲突。以下是可能的原因及其对应的解决办法: #### 1. 类库版本问题 如果项目中引入的 `javax.annotation-api` 版本较低,则可能导致缺少 `lookup` 方法的支持。建议升级到支持该方法的更高版本,例如 `javax.annotation-api-1.3.2.jar`[^1]。 ```xml <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> ``` 通过更新依赖项至最新稳定版可以有效解决问题[^3]。 --- #### 2. 多次导入导致冲突 有时项目中可能存在多个不同版本的 `javax.annotation-api` 或其他相关 jar 文件,这会引发类加载器之间的冲突。可以通过以下方式排查并修复此类问题: - 使用 Maven 的命令检查依赖树是否存在重复或冲突的情况: ```bash mvn dependency:tree | grep annotation ``` 一旦发现有多个版本被引入,应明确排除不必要的旧版本。例如,在 pom.xml 中指定排除某些传递性依赖: ```xml <dependency> <groupId>some.group.id</groupId> <artifactId>some-artifact-id</artifactId> <exclusions> <exclusion> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> </exclusion> </exclusions> </dependency> ``` 随后重新构建项目以验证是否解决了问题。 --- #### 3. JDK模块化影响 (适用于JDK 9及以上) 自 JDK 9 起,Java 平台采用了模块化的架构设计,部分功能默认不再自动包含于标准库之中。对于需要访问 `javax.annotation.*` 包的应用程序来说,需显式声明启用相应模块。可以在编译阶段配置如下插件设置来兼容此需求[^4]: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>11</release> <fork>true</fork> <compilerArgs> <arg>--add-modules</arg> <arg>java.xml.ws.annotation</arg> </compilerArgs> </configuration> </plugin> ``` 注意调整 `<release>` 参数匹配实际所用 JDK 版本号。 --- #### 4. 运行环境中的类路径污染 即使开发环境下一切正常,部署目标服务器上的 JAR 可能仍存在问题——比如遗留下来的低版本 `javax.annotation-api` 替代了新版本文件位置。因此有必要确认生产系统的完整依赖链路无误,并清理掉任何潜在干扰源后再尝试启动应用服务[^5]。 --- ### 总结代码片段 综合以上分析可得完整的 POM 配置实例供参考: ```xml <!-- 添加正确的依赖 --> <dependencies> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> </dependencies> <!-- 编译参数适配高版本 JDK --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <fork>true</fork> <compilerArgs> <arg>--add-modules</arg> <arg>java.xml.ws.annotation</arg> </compilerArgs> </configuration> </plugin> </plugins> </build> ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hpeacheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值