2017-10-06 90 views
2

我有兩個接口名稱相同但包裝不同。 因爲我autowired他們我必須給他們的名字。我的界面是com.example.mysql.UserRepositorycom.example.mongo.UserRepository爲存儲庫配置beans文件

所以我已經宣佈他們是這樣的:

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

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

,並用它們像這樣:

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

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

現在我不知道我怎麼能做到這一點豆配置文件。我試過<bean id="mysqlService" lazy-init="true" class="ee3.demo.repositories.mysql.UserRepository"/> 但我得到錯誤interface not allowed for non abstract beans。 我想知道這樣做的正確方法是什麼, 這個問題,如果不同this問題,因爲這個問題只有一個接口,並不需要使用限定符來指定他需要哪個接口 我到目前爲止嘗試過的是HERE

+1

我認爲你應該使用['MongoRepository'](https://docs.spring.io/spring-data/mongodb/docs/current/api/org /springframework/data/mongodb/repository/MongoRepository.html)而不是第二種情況下的'JpaRepository'。 – naXa

+0

是的,謝謝,我解決了它 –

+0

你說你的問題與鏈接的不同,但你得到同樣的錯誤。如果您嘗試提出的解決方案(從您的配置中刪除錯誤的''聲明),您將解決您的錯誤。 – naXa

回答

1

如果你想使用你並不需要爲所有的倉庫聲明豆XML配置配置Spring數據。請參閱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上標註屬性)給予不同的名稱。我懷疑如果你有多個同名的接口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 Data的好處...在文檔中查找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

我得到錯誤'不能自動裝配。有不止一個UserRepository類型的bean' –

1

必須desclare別名這些bean

例如

<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

你確定我可以使用這樣的別名嗎?並請提供一些關於'alias'作業的更多細節 –

+0

@Joe你可以看看https://docs.spring.io/spring/docs/3.2.6.RELEASE/spring-framework-reference/html/beans.html#beans -beanname-alias –

+0

嗯,這不是我在找的,我的問題不是類別名稱的使用別名,我的問題是'接口',不能用於bean,我需要命名這個存儲庫 –