2015-05-20 4 views
2

У меня есть класс ресурсDependency Injection в джерси 2,17

@Path("/rest") 
public class DemoResourceController { 
    @Inject 
    DemoService demoService; 

    @Path("/get/demo") 
    @GET 
    @Produces(APPLICATION_JSON) 
    public Response getDemoLists() { 
     List<String> demoList=demoService.getDemoList(); 
     return Response.ok(demoList).build(); 
    } 

Я попытался ответить на пост Dependency injection with Jersey 2.0

, если я использую

compile group: "org.glassfish.jersey.ext.cdi" , name: "jersey-cdi1x" , version: "2.17" 
compile group: "org.glassfish.jersey.ext.cdi" ,name: "jersey-weld2-se" , version: "2.17" 

При запуске сервера я получаю

org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408: 
Unsatisfied dependencies for type demoService with qualifiers @Default 
[BackedAnnotatedField] @Inject DemoResourceController.demoService at injection point 

Если я удалить указанную выше зависимость, то я получить

javax.servlet.ServletException: A MultiException has 3 exceptions. They are: 
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no 
    object available for injection at SystemInjecteeImpl(requiredType=DemoService,parent=DemoResourceController,qualifiers={},position=- 1,optional=false,self=false,unqualified=null,1952079126)** 
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of DemoResourceController errors were found 
3. java.lang.IllegalStateException: Unable to perform operation: resolve on package.DemoResourceController 

org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:421) 

Класс ResourceConfig является

public class ApplicationConfig extends ResourceConfig { 

    public ApplicationConfig() { 
    register(new ApplicationBinder()); 
    packages(..name of packages..); 
    } 

Класса связующего

public class ApplicationBinder extends AbstractBinder{ 
    @Override 
    protected void configure() { 
     bind(DemoService.class).to(DemoServiceImpl.class); 
    } 
} 

Я использую Tomcat во встроенном режиме и добавить параметры инициализации

Context ctx = tomcat.addContext("/", new File("web-app").getAbsolutePath()); 
Wrapper wrapper = ctx.createWrapper(); 
wrapper.addInitParameter("javax.ws.rs.Application","xx.xx.ApplicationConfig"); 

Как мне ввести службу в контроллер? Является ли инъекция предпочтительным способом тестирования блока (когда реализация службы, например, demoServiceImpl вызывает другой сервис, скажем, XService), а модульные тесты не должны зависеть от Xservice и, следовательно, demoServiceImpl Как бы я ввел макет службы в контроллер из теста?

+0

Попробуйте '@ InjectParam' –

ответ

2

Во второй попытке (без зависимостей cdi, используя HK2) ваша привязка неверна. Это должно быть

bind(Implementation).to(Contract) 
// - i.e. 
bind(DemoServiceImpl.class).to(DemoService.class); 

У вас есть это наоборот.

Что касается тестирования, если у вас есть тест в том же пакете (в тестовой зоне проекта), вы должны иметь возможность назначить услугу, так как это частный пакет. Хотя лично я привык к инъекции конструктора. Другое дело, что вы можете использовать Jersey Test Framework. Вы можете увидеть полный пример here, где вводится макет службы

+0

вы можете ответить на вопрос, как вводить зависимость в JerseyTest здесь http://stackoverflow.com/questions/30789297/is- это-возможно, к потребительной джерси-КДИ-в-любой-JavaSE-приложения – bl3e