2013-07-05 27 views
11

tôi có thể tạo ra từ hai hạt cà phê từ lớp một java sử dụng cấu hình xml sử dụng đoạn mã sau:mùa xuân tạo ra hai hạt cà phê từ một lớp sử dụng chú thích

<context:component-scan base-package="some.package"/> 

    <bean id="dependentBean" class="some.package.DependentBean"> 
     <property name="firstBean" ref="firstBean"/> 
    </bean> 

    <bean id="firstBean" class="some.package.Handler"> 
     <constructor-arg index="0" ref="service"></constructor-arg> 
     <property name="defaultUrl" value="url/first"></property> 
    </bean> 

    <bean id="secondBean" class="some.package.Handler"> 
     <constructor-arg index="0" ref="service"></constructor-arg> 
     <property name="defaultUrl" value="url/second"></property> 
    </bean> 

Mục tiêu của tôi là di chuyển firstBean và secondBean để cấu hình java dựa như thế này :

package some.package; 

@Configuration 
public class Configuration { 

    @Bean(name="firstBean") 
    public Handler firstHandler(Service service){ 
     Handler handler= new Handler(service); 
     handler.setDefaultTargetUrl("url/first"); 
     return handler; 
    } 


    @Bean(name="secondBean") 
    public Handler secondHandler(Service service){ 
     Handler handler = new Handler(service); 
     handler.setDefaultTargetUrl("url/second"); 
     return handler; 
    } 
} 

Nhưng khi bối cảnh bắt đầu tải xuân ném ngoại lệ sau đây:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'firstBean' is defined 

Tuy nhiên nó hoạt động trong trường hợp này:

package some.package; 

    @Component 
    public class Filter{ 

     private Handler handler; 

     @Autowired 
     public Filter(@Qualifier("secondBean") Handler handler) { 
      this.handler = handler; 
     } 

    } 

Handler thực hiện:

public class Handler { 

    private Service service; 

    @Autowired 
    public Handler(Service service) { 
     this.service = service; 
    } 

} 
+2

Bạn có thể hiển thị nội dung đầy đủ của bạn? Với bất kỳ bean nào phụ thuộc vào 'firstBean'. –

+0

Trường hợp ngoại lệ đó bị loại bỏ ở đâu? Đó có phải là do một số autowiring với tên đậu như vòng loại? Nếu có, bạn có thể cung cấp thêm một chút về cấu hình bối cảnh của mình và/hoặc chú thích chèn có liên quan không? –

+0

"Dịch vụ" là gì? –

Trả lời

1

@Autowired luôn theo loại. Nhưng bạn có hai Trình xử lý trong cấu hình của mình. Vì vậy, khi bạn cố gắng autowire lớp trình xử lý, bạn phải xác định vòng loại. Vào mùa xuân này có thể giải quyết trường hợp nào cần tiêm. Khác, mùa xuân ném lỗi hiển thị NoSuchBeanDefinitionFoundError. Dự kiến ​​một tìm thấy hai.

Hy vọng điều đó sẽ hữu ích.

+0

Điều này có thể không chính xác. Lỗi rõ ràng nói rằng nó cố gắng tra cứu bean theo tên. OP đang sử dụng '@ Qualifier'. –

+0

Cảm ơn tất cả vì câu trả lời. Trên thực tế vấn đề của tôi là trong web.xml. Tôi có hai bối cảnh khác nhau và chính xác nó không được kích hoạt :) – fashuser

-1

Từ Spring Docs, phần 5.9.3:

Nếu bạn có ý định thể hiện tiêm chú thích-driven theo tên, không chủ yếu sử dụng @Autowired, ngay cả khi là về mặt kỹ thuật có khả năng đề cập đến một tên đậu qua @Qualifier values. Thay vào đó, hãy sử dụng chú thích JSR-250 @Resource, được định nghĩa ngữ nghĩa để xác định một thành phần đích cụ thể theo tên duy nhất của nó, với kiểu khai báo không liên quan đến quá trình khớp.

Có một ví dụ về điều này trong phần 5.9.5, nhưng đối với mã của bạn, Lọc lớp học của bạn sẽ giống như thế:

package some.package; 

@Component 
public class Filter { 

    private Handler handler; 

    @Resource(name="secondBean") 
    public Filter(Handler handler) { 
     this.handler = handler; 
    } 

} 
+0

Ngay cả điều này có một báo giá tài liệu tốt đẹp, nó không thể giải quyết vấn đề.Lỗi rõ ràng nói rằng nó cố gắng tra cứu bean theo tên. OP đang sử dụng '@ Qualifier'. –

+0

-1 Đây có thể là một câu trả lời hữu ích cho một câu hỏi liên quan đến thực hành tốt nhất hoặc một cái gì đó tương tự; cho câu hỏi cụ thể này, tuyên bố của bạn là vô ích. Bên cạnh đó, tuyên bố đó rất có thể được trích dẫn từ ngữ cảnh. –

Các vấn đề liên quan