Weblogic 10.3.6 Spring 3.2 @Autowired不起作用

时间:2014-07-02 18:49:12

标签: spring weblogic

无法让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;
    }
...

3 个答案:

答案 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来实现它。不知道为什么会有效。