2013-11-09 4 views
0

У меня есть следующий сервис отдыха: Код зависимостейПочему CDI не работает?

@ApplicationPath("geo") 
@Path("weather") 
public class MainResource extends Application { 

    @Inject 
    private MainDep dep; 

    @GET 
    public String printGotIt() { 
     return "Got it!"; 
    } 

    @GET 
    @Path("propaganda") 
    public String printPropaganda() { 
     return dep.printPropaganda(); 
    } 
} 

MainDep:

public class MainDep { 
    public String printPropaganda() { 
     return "Interesting enterprise"; 
    } 
} 

Когда я пытаюсь использовать ресурс по следующему адресу: хост: порт/корень/гео/погода GlassFish бросил javax .servlet.ServletException:

type Exception report 

messageInternal Server Error 

descriptionThe server encountered an internal error that prevented it from fulfilling this request. 
exception 
`javax.servlet.ServletException: Servlet.init() for servlet com.app.weather.rs.MainResource threw exception 
root cause` 
A MultiException has 1 exceptions. They are: 
    1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MainDep,parent=MainResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,22064320) 
    root cause 
    org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MainDep,parent=MainResource,qualifiers={}),position=-1,optional=false 

ответ

1

Проблема заключается в том, что вы смешиваете класс ресурсов JAX-RS Application + JAX-RS в одном классе и, кроме того, добавляете CDI-инъекцию в микс.

Попытка отделить приложения JAX-RS от JAX-RS ресурсов, как:

@ApplicationPath("geo") 
public class MainApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> classes = new HashSet<Class<?>>(); 
     classes.add(MainResource.class); 
     return classes; 
    } 
} 

и

@Path("weather") 
public class MainResource { 

    @Inject 
    private MainDep dep; 

    @GET 
    public String printGotIt() { 
     return "Got it!"; 
    } 

    @GET 
    @Path("propaganda") 
    public String printPropaganda() { 
     return dep.printPropaganda(); 
    } 
} 
+0

'public Set > getClasses()' не требуется. Спасибо. – user2966560

1

Вам нужно добавить @RequestScoped к классу.

+1

Я не могу развернуть мое приложение GlassFish 4, если добавить '@RequestScoped 'в класс MainResource. Текст ошибки: «Произошла ошибка Ошибка при развертывании: Исключение при загрузке приложения: Сбой развертывания CDI: WELD-001408 Невыполненные зависимости для типа [Ref ] с квалификаторами [@Default] в точке впрыска [[BackedAnnotatedParameter] Параметр 1 из [BackedAnnotatedConstructor] @Inject org.glassfish.jersey.server.internal.routing.UriRoutingContext (Ref , ProcessingProviders)]. Пожалуйста, смотрите server.log для получения более подробной информации. ' – user2966560

+0

Я думаю, что @RequestScoped по умолчанию, поэтому он не понадобится. – Rafael

+0

В CDI нет значения по умолчанию. –

Смежные вопросы