Поле HttpServletRequest не может быть статическим, окончательным или иметь ошибку типа аннотации с jersey 2 - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующий класс для вызовов REST.До того, как я использовал джерси 1.13, на котором все работало нормально, теперь я обновился до джерси 2.27, я получаю следующую ошибку при любом вызове покоя для данного класса

ПРЕДУПРЕЖДЕНИЕ [http-nio-8080-exec-4] org.glassfish.jersey.internal.Errors.logErrors Обнаружены следующие предупреждения: ПРЕДУПРЕЖДЕНИЕ: не удалось выполнить преобразование службы HK2 для [com.MyClass], за исключением: стек MultiException 1 из 2 java.lang.IllegalArgumentException: Поле (запрос HttpServletRequest в com..MyClass) не может быть статичным, окончательным или иметь тип аннотации

Стек MultiException 2 из 2 java.lang.IllegalArgumentException: при обнаружении SystemDescriptor были обнаружены ошибки (реализация =контракты com.MyClass = {com.MyClass} scope = org.glassfish.jersey.process.internal.RequestScoped qualifiers = {} descriptorType = CLASS descriptorVisibility = NORMAL метаданные = rank = 0 loader = null proxiable = null proxyForSameScope = null analysisName = null analysisNameid = 150 locatorId = 0 identityHashCode = 1270899559 reified = false)

@Path("/myclass")
public MyClass{
@Context
    static
    HttpServletRequest request;

    @Context
    HttpServletResponse response;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/method1")
    public Response method1(PostObj postObj) {
        //implementation
   }

}

Если я удалю статическое ключевое слово, оно будет работать нормально.Но я хочу, чтобы запрос был только статичным.В чем проблема со статическим ключевым словом здесь?Как мне это исправить?

1 Ответ

0 голосов
/ 19 декабря 2018

API JAX-RS из экосистемы технологий Java EE предоставляет аннотацию @Context для внедрения 12 экземпляров объектов, связанных с контекстом HTTP-запросов.Он ведет себя так же, как аннотации @Inject и @Autowired в Java EE и Spring соответственно.

Можно добавить следующие экземпляры объекта:

  • SecurityContext -Экземпляр контекста безопасности для текущего HTTP-запроса
  • Request - Используется для настройки обработки запроса предварительных условий
  • Application, Configuration и Providers - Предоставляет доступ к приложению JAX-RS,конфигурация и экземпляры поставщиков
  • ResourceContext - экземпляры класса контекста ресурса
  • ServletConfig - экземпляр экземпляра ServletConfig
  • ServletContext - экземпляр ServletContext
  • HttpServletRequest - экземпляр HttpServletRequest для текущего запроса
  • HttpServletResponse - экземпляр HttpServletResponse для текущего запроса
  • HttpHeaders - поддерживает ключи и значения заголовков HTTP
  • UriInfo - Запрос параметров и переменных пути из URI с именем

А вот пример внедрения в поле экземпляров:

@Path("/")
public class EndpointResource {
    @Context
    private HttpHeaders httpHeaders;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getHeaders(){
        // Code here that uses httpHeaders
    }
}

Читайте о внедрении, есть причина, по которой вы не можете вводить статические поля.Рекомендуется избегать внедрения зависимостей в статические поля и методы, поскольку оно имеет следующие ограничения и может быть сложным для отладки.

  1. Статические поля будут внедрены после того, как первый объект класса был создан с помощьюDI, что означает отсутствие доступа к статическому полю в конструкторе
  2. Статические поля не могут быть помечены как окончательные, в противном случае компилятор или приложение жалуются на них во время выполнения
  3. Вызываются только статические методыодин раз после того, как был создан первый экземпляр класса
...