1

2 つの異なるプロジェクトに 2 つのクラスがあり、フィールドを自動配線するのが困難です。

プロジェクト パックには、この Computation クラスがあります。

package fr.aaa;

@Component
public class Computation {
    @Autowired
    @Qualifier("curveDAO")
    CurveAccess curveDAO;

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
    }
}

プロジェクト db には、次の CurveAccess インターフェイスがあります。

package com.bbb

public interface CurveAccess {
    // some methods
}

CurveDAO クラスによって実装:

package com.bbb.impl

@Repository("curveDAO")
@Transactional("cvaTxManager")
public class CurveDAO implements CurveAccess {
    // some methods
}

パック プロジェクトからの私の applicationContext.xml ファイル:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:security="http://www.springframework.org/schema/security" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd      
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">  

<import resource="classpath:spring/persistence.xml"/>

<context:annotation-config />
<context:component-scan base-package="fr.aaa.*, com.bbb.*"/> 

<util:properties id="jdbcProps" location="jdbc.properties" />   

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
         <value>classpath:configuration.properties</value>
         <value>classpath:jdbc.properties</value>
        </list>
    </property>
</bean>

実行中に、次の例外があります。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Computation': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.bbb.CurveAccess fr.aaa.Computation.curveDAO; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.bbb.CurveAccess] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=curveDAO)}

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

1

実際、あなたのコードは問題なく動作します:

@SpringBootApplication
public class So21481801Application implements CommandLineRunner {

    public interface CurveAccess {
        String hello();
    }

    @Repository("curveDAO")
    public class CurveDAO implements CurveAccess {
        @Override
        public String hello() {
            return "Hello";
        }
    }

    @Repository("curveDAOWorld")
    public class CurveDAOWorld implements CurveAccess {
        @Override
        public String hello() {
            return "World";
        }
    }

    @Autowired
    @Qualifier("curveDAO")
    CurveAccess curveDAO;

    @Autowired
    @Qualifier("curveDAOWorld")
    CurveAccess curveDAOWorld;

    @Override
    public void run(String... args) {
        System.out.println(curveDAO.hello());
        System.out.println(curveDAOWorld.hello());
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(So21481801Application.class, args);
        context.close();
    }

}

component-scanおそらく、XML と Java アノテーションの構成をどのように使用しているかに問題があります。それらを混ぜるのは得策ではありません。

于 2018-03-01T13:10:38.330 に答える
0

CurveAccessインターフェイスを実装するクラスが必要です

@Component
public class CurveAccessImpl implements CurveAccess {
    //methods
}

id を持つそのような Bean がないため、 in BeanQualifierからも削除します。curveDaoComputationcurveDao

@Autowired
CurveAccess curveDAO;
于 2014-01-31T14:04:26.433 に答える