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
    JavaRX: как вернуть кешированное значение немедленно и параллельно выполнить сетевой запрос Как вернуть интерфейс, например, javawith Kotlin Сервлеты / Undertow – Доступ к HttpServletRequest и HttpServletResponse Android ViewModelProviderFactory в Котлине AWS Lambda Java / Kotlin Отправить сообщение для SQS В чем разница между CoroutineContext и Job в kotlinx.coroutines? Как использовать класс Kotlin в классе java? Преобразование массива ArrayMap в ArrayList – Kotlin Ошибка подключаемого модуля: Kotlin бросил непроверенное исключение IllegalStateException Kotlin: получить суперкласс из объекта класса – ошибка вывода объекта Как настроить динамические опорные точки для поворота анимации Инструментальные тесты не могут выполняться в библиотечных модулях Android с файлами Kotlin Выделение синтаксиса Fisheye / Crucible для Kotlin Почему Kotlin не может вывести следующий аргумент лямбда (после преобразования Java -> Kotlin)? DexFile не содержит сгенерированных классов после добавления конфигурации Kotlin на Android 4.4