2015-04-23 14 views
10

Tôi gặp sự cố với AssistedInject. Tôi làm theo các hướng dẫn trên liên kết này https://github.com/google/guice/wiki/AssistedInject nhưng khi tôi chạy ứng dụng của tôi, tôi nhận được một lỗi:Guice assistedinject đã được định cấu hình

ERROR [2015-04-23 14:49:34,701] com.hubspot.dropwizard.guice.GuiceBundle: Exception occurred when creating Guice Injector - exiting 
! com.google.inject.CreationException: Unable to create injector, see the following errors: 
! 
! 1) A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was already configured at com.demo.migrator.service.democlient.DemoAPIFactory.create(). 
! at com.demo.migrator.service.democlient.DemoAPIFactory.create(DemoAPIFactory.java:1) 
! at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:577) 
! at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) (via modules: com.demo.migrator.MigrationModule -> com.google.inject.assistedinject.FactoryModuleBuilder$1) 

Dưới đây là cấu hình mô-đun của tôi:

install(new FactoryModuleBuilder() 
    .implement(DemoAPI.class, DemoClient.class) 
    .build(DemoAPIFactory.class)); 

Sau đây là cách nhà máy của tôi trông giống như:

public interface DemoAPIFactory { 
    DemoAPI create(String _apiKey, String _secretKey); 
} 

Giao diện được khai báo như sau:

public interface DemoAPI { 
    //list of interface methods 
} 

Và đây là việc thực hiện

@Inject 
public DemoClient(@Assisted String _apiKey, 
     @Assisted String _secretKey) { 
    secretKey = _secretKey; 
    apiKey = _apiKey; 
    baseURL = "xxxxx"; 
    expirationWindow = 15; 
    roundUpTime = 300; 
    base64Encoder = new Base64(); 
    contentType = "application/json"; 
} 

Tôi đang sử dụng gói dropwizard Guice.

Tại sao lỗi này xảy ra?

+3

Hi! Tôi biết bạn đã được khoảng một lúc nhưng bạn đã không hỏi nhiều câu hỏi. Không có đủ thông tin ở đây để trả lời câu hỏi của bạn; xin vui lòng đọc [hỏi]. Cụ thể, dòng cấu hình mô-đun của bạn trông ổn, nhưng chúng ta cần xem hàm tạo ** cho lớp DemoClient.class ** và ** Mã DemoAPIFactory **. Hãy sửa chúng vào câu hỏi của bạn. – durron597

+1

Cảm ơn bạn durron, tôi đã cập nhật tất cả thông tin. – almy

+0

Bạn có 'DemoApi' được định nghĩa ở bất kỳ nơi nào khác không? Chẳng hạn như 'bind (DemoApi.class)'? Nhìn mọi nơi trong tất cả các mô-đun của bạn, bạn chắc chắn có nó ở đâu đó. –

Trả lời

30

Đây là một vấn đề phổ biến, giải pháp được diễn tả trong javadoc:

Making parameter types distinct

The types of the factory method's parameters must be distinct. To use multiple parameters of the same type, use a named @Assisted annotation to disambiguate the parameters. The names must be applied to the factory method's parameters:

public interface PaymentFactory { 
    Payment create(
     @Assisted("startDate") Date startDate, 
     @Assisted("dueDate") Date dueDate, 
     Money amount); } 

...and to the concrete type's constructor parameters:

public class RealPayment implements Payment { 
    @Inject 
    public RealPayment(
    CreditService creditService, 
    AuthService authService, 
    @Assisted("startDate") Date startDate, 
    @Assisted("dueDate") Date dueDate, 
    @Assisted Money amount) { 
    ... 
    } } 
+0

Cảm ơn bạn Jan. Tôi đã hoàn toàn bỏ lỡ phần đó trong tài liệu. Nó thực sự là một con thỏ – almy

+0

Vui vì tôi có thể giúp đỡ. Nếu nó giải quyết được vấn đề của bạn, bạn nên chấp nhận câu trả lời. –

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