2017-11-22 24 views
1

저는 Guice에서 새로운데, AssistedInject를 이해하려고합니다.Guice가 주사를 보조했습니다.

클래스 내가 주입 할 :

public class I1 { 
} 

클래스 원호 주입 :

public interface ICla { 
} 

public class Cla implements ICla{ 
    public Integer t; 
    public I1 i; 

    @Inject 
    public Cla(Integer t, @Assisted I1 i) { 
     this.t = t; 
     this.i = i; 

    } 
} 

공장

public interface IClaFactory { 
    Cla create(Integer t); 
} 

그리고 메인 클래스 나는 아주 간단한 프로젝트를 :

public class Main { 
    public static void main(String[] args) { 
     Injector injector = Guice.createInjector(new Module()); 

     IClaFactory factory = injector.getInstance(IClaFactory.class); 
    } 

    private static class Module extends AbstractModule { 
     protected void configure() { 
      install(new FactoryModuleBuilder() 
       .implement(ICla.class, Cla.class).build(IClaFactory.class)); 
     } 
    } 
} 

하지만 여전히 작동하지 않으며 이해하지 못합니다. 어디서 잘못 되었나요? 와 "지원"할 수있는 매개 변수 팩토리 인터페이스에 정의 된 매개 변수입니다 :

Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors: 

1) No implementation for ru.test.factory.I1 annotated with @com.google.inject.assistedinject.Assisted(value=) was bound. 
    while locating ru.test.factory.I1 annotated with @com.google.inject.assistedinject.Assisted(value=) 
    for parameter 1 at ru.test.factory.Cla.<init>(Cla.java:11) 
    at ru.test.factory.IClaFactory.create(IClaFactory.java:1) 
    at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:660) 
    at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) (via modules: ru.test.Main$Module -> com.google.inject.assistedinject.FactoryModuleBuilder$1) 

2) Could not find a suitable constructor in java.lang.Integer. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. 
    at java.lang.Integer.class(Integer.java:52) 
    while locating java.lang.Integer 
    for parameter 0 at ru.test.factory.Cla.<init>(Cla.java:11) 
    at ru.test.factory.IClaFactory.create(IClaFactory.java:1) 
    at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:660) 
    at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) (via modules: ru.test.Main$Module -> com.google.inject.assistedinject.FactoryModuleBuilder$1) 

답변

2

당신은 잘못된 매개 변수를 -ing하는 @Assisted입니다. 이 경우 귀하의 I1이 아닌 귀하의 Integer입니다.

이 작동합니다 :

@Inject 
public Cla(I1 i, @Assisted Integer t) { 
    this.t = t; 
    this.i = i; 

} 
+0

그것은 내 문제를 해결했다. Guice가 나를 도와 준다고 생각했지만 실제로는 Guice가 내 도움이 필요했습니다. – Andrew

+0

@Andrew 문제가 팔렸기 때문에 기쁩니다. 그랬기 때문에이 대답을 받아 들일 수 있겠습니까? 답의 요점 아래에있는 체크 표시를 클릭합니다. 감사 ;-) –