2011-10-21 33 views
9

Tôi có một giao diệnGiải quyết mâu thuẫn với mùa xuân @Autowired và @Qualifier

public interface ParentService{} 

Và Hai thi Lớp

@Service("child1service")  
public class Child1 implements ParentService{} 

@Service("child2service") 
public class Child2 implements ParentService{} 

Bây giờ điều khiển của tôi

public class ServeChild1Controller extendds AbstractController{ 

@Autowired 
public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){ 
super(child1service) 
    } 

Tương tự như vậy có ServeChild2Controller ..

Vì vậy, khi tôi chạy tôi nhận được lỗi sau

Lỗi cho ServeChild1Controller: Không đậu độc đáo của loại [com.service.ParentService] được định nghĩa: dự kiến ​​đậu khớp đơn nhưng thấy 2 child1service, child2service

Am cố gắng để tìm hiểu thêm về những chú thích nhưng không thể giải quyết nó .. Bất kỳ con trỏ sẽ được giúp đỡ Cảm ơn

+0

Phiên bản nào của mùa xuân nào bạn sử dụng? – jeha

+0

mùa xuân 3.0.5 Phiên bản tôi đang sử dụng – harshit

Trả lời

17

Để sử dụng một trường hợp cụ thể mà bạn cần phải cung cấp GHi chú vào vùng dịch vụ với @Qualifier (id) và trong các nhà xây dựng anotate tham số với @Qualifier một lần nữa, như sau:

@Service("child1service") 
@Qualifier("child1service") 
public class Child1 implements ParentService{} 

@Service("child2service") 
@Qualifier("child2service") 
public class Child2 implements ParentService{} 

Và bạn constructor:

public class ServeChild1Controller extendds AbstractController{ 

    @Autowired 
    public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){ 
     super(child1service) 
    } 

} 
+0

hiện nó cần thiết để xác định id với cả hai dịch vụ và trình độ chuyên môn? –

+1

@DaxJoshi: bạn chỉ có thể xác định nó trên '@ Qualifier' –

-1

tôi nghĩ rằng chú thích @Qualifier có thể cần phải được cung cấp ở mức độ tương tự như các chú thích @Autowired .

+4

đặt @Qualifier trên constructor là không được phép .. – harshit

0

Với Spring (đậu) 4.3 nó hoạt động chính xác theo cách bạn đã viết trong câu hỏi của bạn.

Tôi có thể cung cấp cho bạn ví dụ về cách triển khai mà tôi đã gặp phải gần đây. Mùa xuân có thể autowire dựa trên loại và sự phân biệt vòng loại. Sử dụng tên dịch vụ là không đủ vì chúng cần phải là duy nhất, do đó bạn sẽ kết thúc với xung đột loại.

Ví dụ:

public interface ServiceA {} 
public interface ServiceB {} 

@Qualifier("mockedA")  
@Service 
public class MockedA implements ServiceA {} 

@Qualifier("realA") 
@Service 
public class RealA implements ServiceA {} 

@Qualifier("mockedB")  
@Service 
public class MockedB implements ServiceB {} 

@Qualifier("realB") 
@Service 
public class RealB implements ServiceB {} 

@Autowired 
public ABController (
    @Qualifier("mockedA") ServiceA mockedA, 
    @Qualifier("realA") ServiceA realA, 
    @Qualifier("mockedB") ServiceB mockedB, 
    @Qualifier("realB") ServiceB realB) { 
} 
Các vấn đề liên quan