我一直在尝试从 JBOSS 5 升级到 jboss 7,但遇到以下异常。
at java.lang.Thread.run(Thread.java:619) [rt.jar:1.6.0_20]
Caused by: java.lang.IllegalArgumentException: JBAS011089: @Resource injection target is invalid. Only setter methods are allowed: void com.myaccount.admin.manager.dao.ManagerDaoImpl.init(com.ibatis.sqlmap.client.SqlMapClient)
at org.jboss.as.ee.component.deployers.ResourceInjectionAnnotationParsingProcessor.processMethodResource(ResourceInjectionAnnotationParsingProcessor.java:192)
at org.jboss.as.ee.component.deployers.ResourceInjectionAnnotationParsingProcessor.deploy(ResourceInjectionAnnotationParsingProcessor.java:153)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
... 5 more
这是代码
@Repository("managerDao")
public class ManagerDaoImpl extends SqlMapClientDaoSupport implements ManagerDao {
@Resource(name="sqlMapClient_ADMIN")
public void init(SqlMapClient sqlMapClient) {
setSqlMapClient(sqlMapClient);
}
......
我用谷歌搜索,但除了 jboss jar 的源代码之外,我没有找到任何东西。
最佳答案
如果您查看 ResourceInjectionAnnotationParsingProcessor
processMethodResource
源代码,您会看到:
if (!methodName.startsWith("set") || methodInfo.args().length != 1) {
throw new IllegalArgumentException("@Resource injection target is invalid. Only setter methods are allowed: " + methodInfo);
}
它检查方法名称是否不以“set”开头
它会抛出异常。因此,要么将您的 init
方法重命名为以 set
开头,要么只是注入(inject)字段,用 @PostConstruct 注释您的 init
方法。注释是这样的:
@Autowired
private SqlMapClient sqlMapClient;
@PostConstruct
public void init() {
setSqlMapClient(sqlMapClient);
}
使用后置构造注释方法可能是更好的解决方案,因为将来您可能需要添加(或更改)更多内容以进行初始化,因此您唯一需要做的就是修改 init( )
方法。
关于java - @Resource注入(inject)目标无效。仅允许设置方法 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019947/