2017-02-15 5 views
0

Nous travaillons sur une application drop-wizard et utilisons Guice for Injection.
J'ai l'appel HTTP suivant et j'instancie le modèle http et le modèle de repos. Au lieu de cela, je cherche des moyens pour que Guice injecte ces objets. Comment puis je faire ça ?Remplacer Http RestTemplate à l'aide de Guicier injection [Dropwizard]

RestTemplate restTemplate = new RestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     HttpEntity request; 
     headers.set("Accept", MEDIA_TYPE); 
     request = new HttpEntity(jsonContent, headers); 

    return restTemplate.exchange(url, httpMethod, request, String.class); 

Répondre

3

Idéalement, vous créez des usines pour les objets fréquemment créés et injectez les usines en tant que dépendances. Pour les tests unitaires, vous pouvez simuler la sortie des usines et avoir un contrôle complet sur le flux de code.

Mais si vous voulez injecter RestTemplate comme une dépendance directe alors vous pouvez écrire un module comme celui-ci:

public MyModule extends AbstractModule { 
    @Override 
    public void configure() { 
    } 

    @Provides 
    public RestTemplate providesRestTemplate() { 
     return new RestTemplate(); 
    } 
} 

Ou comme ceci:

public MyModule extends AbstractModule { 
    @Override 
    public void configure() { 
     bind(RestTemplate.class); 
    } 
} 

premier exemple utilise l'annotation Guice @Provides que je personnellement préfèrent. Le second utilise une liaison directe à la classe concrète. Les deux atteignent le même résultat et vous pouvez injecter la dépendance dans une classe comme indiqué ci-dessous.

public MyClass { 
    private final RestTemplate restTemplate; 

    @Inject 
    public MyClass(RestTemplate restTemplate) { 
     this.restTemplate = restTemplate; 
    } 
}