2017-10-06 2 views
2

私は同じ名前の2つのインターフェースを別々のパッケージに持っています。 私はautowiredです。私はそれらに名前を付ける必要があります。 私のインターフェイスはcom.example.mysql.UserRepositorycom.example.mongo.UserRepositoryです。リポジトリのBeanファイルを設定する

だから私はこのようにそれらを宣言している:今、私は豆でこれを行うことができますどのように疑問に思う

@Autowired 
ee3.demo.repositories.mysql.UserRepository userRepository; 

@Qualifier("mongorepo") 
@Autowired 
UserRepository userRepository1; 

@Repository(value = "mysqlrepo") 
public interface UserRepository extends JpaRepository<User,Long> ... 

@Repository(value = "mongorepo") 
public interface UserRepository extends MongoRepository<User,String> ... 

と、このようにそれらを使用ファイルを構成します。 試しました<bean id="mysqlService" lazy-init="true" class="ee3.demo.repositories.mysql.UserRepository"/> ですが、エラーinterface not allowed for non abstract beansが発生しています。 私はこれを行う正しい方法は何ですか? この質問と異なる場合this質問この質問はただ1つのインターフェイスがあり、必要なインターフェイスを指定する修飾子を使用する必要はありません これまでに試したことはHERE

+1

私はあなたがhttps://docs.spring.io/spring-data/mongodb/docs/current/api/org([ 'MongoRepository']を使用すべきだと思います/springframework/data/mongodb/repository/MongoRepository.html)インタフェースを使用します。 – naXa

+0

はい、ありがとう、私はそれを修正しました –

+0

あなたはあなたの質問がリンクされたものと異なると言うが、同じエラーが発生します。提案された解決策を試してみると(あなたの設定からbad ''宣言を削除してください)、エラーを解決します。 – naXa

答えて

1

のためにこれらのBeanのため

をエイリアスをdesclare必要があります。詳しくはSpring Data docsを参照してください。スキャン用の基本パッケージを指定する方が簡単です。

<?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:jpa="http://www.springframework.org/schema/data/jpa" 
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd 
    http://www.springframework.org/schema/data/mongo 
    http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd"> 

    <!-- 
    Configure Spring Data JPA/MongoDB and set the base package of the 
    repository interfaces 
    --> 
    <jpa:repositories base-package="com.example.mysql"/> 
    <mongo:repositories base-package="com.example.mongo"/> 

... 

Read moreこの記事では、


あなたはあなたのリポジトリ(アノテーションの使用value属性)に異なる名前を与える必要があり

EDIT。私はあなたが同じ名前の複数のインターフェイスを持っていると思われますUserRepository、それらのすべてが最新の宣言されたbeanによってオーバーライドされるでしょう。これはGitHub

DemoApplication.java

@SpringBootApplication 
//@ImportResource("classpath:beans.xml") 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 
} 

beans.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" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
</beans> 

mysql.UserRepository.java

@Repository(value = "userRepositoryJpa") 
public interface UserRepository extends JpaRepository<User,Long> { 
    User findByName(String name); 
} 

mongodb.UserRepositoryから変更されたコードです。Javaの

@Repository(value = "userRepositoryMongo") 
public interface UserRepository extends MongoRepository<UserMongo, String> { 
    User findByName(String name); 
} 

EDIT 2

別のオプションは、これらのインタフェースのための独自の実装を記述し、XMLからそれらを参照することです。 @Repository,@EnableJpaRepositories@EnableMongoRepositories注釈も削除する必要があります。すべてのメソッドを自分で実装する必要があります。しかし、Springデータの利点を失う... Custom implementations for Spring Data repositoriesをドキュメントで探してください。

public interface UserRepositoryImpl implements UserRepository { 
    public User findByName(String name) { 
     // your custom implementation 
    } 
} 

XML構成例

<jpa:repositories base-package="com.example.repositories.mysql" repository-impl-postfix="Impl" /> 
<mongo:repositories base-package="com.example.repositories.mongodb" repository-impl-postfix="Impl" /> 

<beans:bean id="jpaUserRepositoryImpl" class="com.example.repositories.mysql.UserRepositoryImpl"> 
</beans:bean> 

<beans:bean id="mongoUserRepositoryImpl" class="com.example.repositories.mongodb.UserRepositoryImpl"> 
</beans:bean> 
+0

それらをインスタンス化するために '@ AutoWired'と' @ Qualifier'でどのように使用できますか? –

+0

あなたは '@ Autowire'を名前ではなくタイプ別に使うことができますか?次に、修飾子「 – naXa

+0

」が必要になりました。「Could not Autowired」エラーが発生しました。 UserRepositoryタイプの複数のBeanがあります。 –

1

あなたはXML設定を使って春のデータを設定したい場合は、すべてのあなたのリポジトリのための豆を宣言する必要はありません例

<bean id="mysqlService" lazy-init="true" alias="mysqlrepoAlias" 
class="ee3.demo.repositories.mysql.UserRepository"/> 

<bean id="mongorepoService" lazy-init="true" alias="mongorepoAlias"class="ee3.demo.repositories.mysql.UserRepository"/> 
+0

私はこのようなエイリアスを使用できますか? 'エイリアス'ジョブについてもう少し詳しく述べてください。 –

+0

@Joeあなたはhttps://docs.spring.io/spring/docs/3.2.6.RELEASE/spring-framework-reference/html/beans.html#beansを見ることができます-beanname-alias –

+0

これは私が探しているものではなく、問題はクラス名のエイリアスを使用していません。私の問題はbeanで使用できない 'interface'です。このリポジトリに名前を付ける必要があります –

関連する問題