Ошибка CDI с классом зависимой / прикладной области - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь внедрить ServletContext в моем зависимом классе области, но это всегда дает сбой.

java.lang.IllegalStateException: No CXF message usable for JAX-RS @Context injections in that thread so can't use interface javax.servlet.ServletContext

Я не могу понять причину, по которой я не могу ввести это здесь.Я использую метод производителя, и когда внутри метода производителя, я пытаюсь получить доступ к ServletContext obj, тогда это дает выше исключение.Я также проверил, является ли контекст Injected сервлета пустым, но не нулевым.Но когда я вызываю любой метод, использующий его, например, sc.getContextPath(), это дает вышеупомянутое исключение.Ниже приведен фрагмент кода:

@Dependent
public class AuthContexthandler {

  @Context
  ServletContext sc;

  @Produces
  JWTAuthContextInfo getInfo() {
    try{
      System.out.println(sc.getContextPath()); //here I get the above mentioned error
      //rest of the code
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

1 Ответ

0 голосов
/ 22 ноября 2018

вы должны использовать @inject вместо @ Context.

вы можете использовать @Context для внедрения экземпляров объектов, связанных с контекстом HTTP-запросов, в исходный класс JAX-RS и как AuthContextHandler (как @Christoph Böhmeсказал) не является исходным классом JAX-RS, поэтому вы не можете использовать @ Context

, но как http://docs.jboss.org/weld/reference/latest/en-US/html_single/ говорит:

Объект, связанный с контекстом жизненного цикла, называетсябоб.CDI включает встроенную поддержку для нескольких различных типов bean-компонентов, включая следующие типы компонентов Java EE:

управляемые bean-компоненты и EJB-сеансовые bean-компоненты.И управляемые bean-компоненты, и EJB-сеансовые bean-компоненты могут внедрять другие bean-компоненты.Но некоторые другие объекты, которые сами по себе не являются bean-компонентами в том смысле, в котором они здесь используются, также могут иметь bean-объекты, внедренные через CDI.В платформе Java EE компоненты следующих типов могут иметь встроенные компоненты:

компоненты, управляемые сообщениями,

перехватчики,

сервлеты,

сервлетфильтры и

прослушиватели событий сервлета,

конечные точки и обработчики службы JAX-WS,

ресурсы JAX-RS,

провайдеры и javax.ws.rs.core.Application подклассы и

обработчики тегов JSP и прослушиватели событий библиотеки тегов.

это означает, что вы также можете использовать аннотацию @Inject в своем исходном классе JAX-RS.

В CDI также есть несколько предопределенных Бинов, таких как ServletContext, которые вы можете использовать аннотацией @inject для их внедрения.

https://docs.jboss.org/seam/3/servlet/latest/reference/en-US/html/injectablerefs.html https://docs.oracle.com/javaee/7/tutorial/cdi-adv004.htm

...