Внедрить ServletContext в приложение Quarkus

Играя с Кваркус, я пытаюсь внедрить ServletContext в свое приложение:

@Controller
@Path("/greeting/")
@RequestScoped
public class GreetingResource {
    @Inject
    ServletContext servletContext;
}

Он отлично компилируется, но на этапе упаковки quarkus-maven-plugin дает сбой:

[1] Unsatisfied dependency for type javax.servlet.ServletContext and qualifiers [@Default]
    - java member: exampleapp.GreetingResource#servletContext
    - declared on CLASS bean [types=[java.lang.Object, exampleapp.GreetingResource], qualifiers=[@Default, @Any], target=exampleapp.GreetingResource]

Мое приложение зависит от io.quarkus:quarkus-отдых, который извлекает io.quarkus: quarkus-отлив, который, в свою очередь, извлекает io.undertow:undertow-сервлет.

Я ожидаю, что любое из расширений Undertow обеспечит инъекцию ServletContext, но, видимо, мое предположение неверно... Есть идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 506
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Небольшая возня показала мне, что для этого типа нет метода производителя... Мне помог следующий фрагмент кода:

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Singleton;
import javax.servlet.ServletContext;

import io.undertow.servlet.handlers.ServletRequestContext;

@Singleton
public class ServletContextProducer {
    @Produces
    @RequestScoped
    public ServletContext servletContext() {
        return ServletRequestContext.current().getCurrentServletContext();
    }
}
Ответ принят как подходящий

@Inject ServletContext работает только в среде Java EE. Quarkus интегрирует JAX-RS, поэтому вы можете получить доступ к экземпляру ServletContext с помощью JAX-RS @Context.

@Controller
@Path("/greeting/")
@RequestScoped
public class GreetingResource {

    // javax.ws.rs.core.Context
    @Context
    ServletContext servletContext;

    // OR

    @GET
    @Path("/test")
    @Produces({ MediaType.TEXT_PLAIN })
    public Response test(@Context ServletContext servletContext) {
        // return ...
    }
}

Ваш способ тоже работает, но он явно зависит от Undertow API.

Обновлено:

В Quarkus версии 0.17.0+ добавлена ​​поддержка внедрения ServletContext с использованием аннотации CDI @Inject. См. этот https://github.com/quarkusio/quarkus/pull/2850

Другие вопросы по теме