JAX-RS (Apache CXF) Контекстная инъекция через сеттер

Я пытаюсь добавить HttpServletRequest к моему ресурсу JAX-RS (реализация Apache CXF) с помощью аннотации @Context в Котлине. Он отлично работает, если я ввожу его через параметр метода. Но я не хочу «путать» свои интерфейсы с этим, поэтому я хотел бы вводить его через поле / сеттер.

Вещь с простой инъекцией поля заключается в том, что прокси имеет $ в своем имени, что является проблемой для kotlin, поскольку он не может работать с именами классов с долларом по имени.

Поэтому я пытаюсь сделать это с помощью setter с помощью этого простого метода:

var req : HttpServletRequest? = null Context fun setRequest(req : HttpServletRequest) { this.req = req } 

Дело в том, что (и я считаю, что это тоже проблема на Java), что сеттер вызывается через отражение в org.apache.cxf.jaxrs.utils.InjectionUtils в методе injectThroughMethod, который бросает java.lang.IllegalArgumentException: объект не является экземпляр объявления класса

Я попытался решить эту проблему, но не повезло. Кто-нибудь имел схожую проблему или есть что-то, что я делаю неправильно?

Кстати, я также создал проблему в JIRA CXF.

    Благодаря ребятам, комментирующим вопрос CXF Jira, мне удалось это решить. Чтобы сделать инъекцию setter, работающую с CXF, вы должны определить setter также в своем интерфейсе (не только для класса реализации) и аннотировать его с помощью @Context там (на интерфейсе). Я не уверен, что это действительно соответствует спецификации, но похоже, что CXF требует этого.

    Как это:

     public MyInterface { @Context public void setRequest(HttpServletRequest req); } public MyClass implements MyInterface { private HttpServletRequest req; public void setRequest(HttpServletRequest req) { this.req = req; } } 

    Объяснение Сергея от CXF Jira:

    Это не стандартная конкретная проблема, все дело в том, что объект службы, предоставляемый во время выполнения, является прокси-сервером, а перемещение установщика в интерфейс гарантирует, что этот сеттер является частью прокси-сервера. В моих тестах у меня нет этих сеттеров на главном интерфейсе, представляющем службу, но на выделенном интерфейсе, таком как Injectable. Кроме того, с Spring, по крайней мере, может помочь режим прокси-сервера Cglib.

    Intereting Posts
    Как сделать multiconditional для цикла в kotlin Почему плагин Kotlin добавляет ссылку kotlin-stdlib-jre7 (не kotlin-stdlib) для Android-проекта Получение пустого списка из области, когда я запускаю приложение Android в первый раз. Каков правильный подход к «Этот класс AsyncTask должен быть статическим или может возникнуть утечка» в Kotlin Android? Почему экземпляр $ MockitoMock $ не идентифицируется как макет? Ошибка компиляции вывода типа Kotlin при использовании API-интерфейса Akka Почему для цикла с тремя точками компилируется? Ленивая инициализация элемента с нулевым значением Подкласс RelativeLayout со вторичными конструкторами в Котлине Свойства бина, не равные нулю при инициализации, становятся нулевыми при вызове метода @Transactional Как проверить, отсортирован ли массив строк в алфавитном порядке или нет с помощью Kotlin? Могу ли я ссылаться на определенную функцию перегрузки? Почему невозможно использовать ссылки на методы `suspend` в Kotlin? можно ли добавить шаблон в getter / setter класса данных? Как оживить ConstraintLayout снизу вверх экрана?