无法让Autowiring工作。目前,升级到Weblogic不是我们组织的选择。以下是浏览器启动网站时显示的内容。此外,还包括相关的编码作为插图。
org.springframework.beans.factory.BeanCreationException:使用名称' acmeService创建bean时出错':注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.acme.data.AcmeDao com.acme.service.AcmeService.acmeDao;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[com.acme.data.AcmeDao]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
context.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:annotation-config/>
<bean id="baseDao" class="com.acme.BaseDao" abstract="true">
<property name="dataSource" ref="oracleDS" />
</bean>
<bean id="oracleDS" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc-acme" />
</bean>
<bean id="service" class="com.acme.service.AcmeService">
<property name="acmeDao" ref="acmeDao" />
</bean>
<bean id="acmeDao" class="com.acme.service.AcmeDao"
parent="baseDao" />
</beans>
AcmeService.java:
package com.acme.service;
import com.acme.data.AcmeDao;
import com.acme.load.beans.ProviderEligibilityBean;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AcmeService implements AcmeServiceInterface {
final Logger logger = Logger.getLogger(AcmeService.class);
@Autowired
private AcmeDao acmeDao;
public void setAcmeDao(AcmeDao acmeDao) {
this.acmeDao = acmeDao;
}
...
答案 0 :(得分:1)
AcmeService.class中的两个问题。
1)您导入了com.acme.data.AcmeDao,但是您在context.xml中引用了com.acme.service.AcmeDao。
2)您正在context.xml中的AcmeService bean定义中设置com.acme.service.AcmeDao引用
如果要引用com.acme.service.AcmeDao,请将import更改为com.acme.service.AcmeDao。然后,删除@Autowired注释,因为您已在context.xml中引用它。
答案 1 :(得分:0)
仔细查看完整的堆栈跟踪。弹簧堆栈的痕迹非常冗长,如果你不注意,很难解释。特别是,当根本原因实际上无法创建要注入的bean时,您可能会得到一个异常,说注入失败。
这个将在堆栈跟踪中指定,但稍微向下。在这种情况下,例如,一个可能的原因可能是不能创建数据源,例如,如果JNDI名称不正确。
答案 2 :(得分:0)
通过在AcmeDao中添加@Repository来实现它。不知道为什么会有效。