2011-01-12 30 views
5

Theo tài liệu ThrowingProvider của Guice Tôi có giao diện sau:Guice ThrowingProvider vấn đề

public interface IConfigurableProvider<T> extends ThrowingProvider<T, ConfigException> {} 

Tôi có nhiều lớp mà thực hiện giao diện này, chúng ta hãy giả sử tôi có như sau:

public class SomethingProvider extends ConfiguredProvider implements IConfigurableProvider<Something> {} 

Trong số Tất nhiên, lớp học này triển khai phương pháp cần thiết:

public Something get() throws ConfigException { /* ... */ } 

Trong mô-đun của tôi, tôi có đoạn mã sau vào MyModule.java

ThrowingProviderBinder.create(binder()) 
    .bind(IConfigurableProvider.class, Something.class) 
    .to(SomethingProvider.class); 

Nhưng khi tôi bắt đầu ứng dụng của tôi được lỗi sau sản xuất:

6) No implementation for com.package.Something was bound. 
    while locating com.package.Something 
    for parameter 5 at com.package.OtherClass.<init>(OtherClass.java:78) 
    at com.package.MyModule.configure(MyModule.java:106) 

tôi không thực sự biết được nơi tôi nên bắt đầu tìm kiếm các lỗi .

Cập nhật: Nó cung cấp các lỗi tương tự ngay cả khi tôi thiết lập các phạm vi cũng như:

ThrowingProviderBinder.create(binder()) 
    .bind(IConfigurableProvider.class, Something.class) 
    .to(SomethingProvider.class) 
    .in(Singleton.class); 
+0

Khi câu trả lời được chấp nhận chỉ ra, tôi đã hiểu nhầm cách sử dụng 'ThrowingProviderBinder'. Các nhà xây dựng được tiêm nên đợi cho một nhà cung cấp thay vì các đối tượng được cung cấp (và có nên được kiểm tra ngoại lệ xử lý). –

Trả lời

3

Thay vì tiêm Something, bạn cần phải tiêm IConfigurableProvider<Something>:

public class OtherClass { 
    @Inject 
    public OtherClass(IConfigurableProvider<Something> somethingProvider) { 
    ... 
    } 
} 

này là vì nó chỉ nằm trong mã của OtherClass (hoặc bất kỳ mã nào sử dụng một thể hiện của Something), bạn có thể xử lý các trường hợp ngoại lệ do Nhà cung cấp đưa ra, chẳng hạn như ConfigException trong trường hợp của bạn.

+0

nhưng tôi không muốn sửa đổi các nhà xây dựng. có cách nào để đạt được những gì tôi thực sự muốn không? –

+1

Tôi nghĩ mình sẽ quên 'ThrowingProvider' và đơn giản sử dụng giao diện' Provider' và bọc ngoại lệ nguồn vào 'ProvisionException' –