Как создать "Custom Injection Provider" (фабрику) без трикотажа

Есть ли способ достичь того же результата, описанного здесь, не в зависимости от джерси, а только от jax-rs? Я хотел бы создать пользовательского поставщика инъекций, например Jersey, чтобы я мог внедрить MyClass, извлекая пользовательские данные из HttpServletRequest

@Inject
protected MyClass myClass;

Я также нашел полезным это обсуждение, он работает так же с java.util.function.Supplier, но Джерси все еще нужен в этом коде:

bindFactory(MyFactoryOrSupplier.class)
.to(MyClass.class)
.in(RequestScoped.class);

Обновлено:

CDI также является хорошей альтернативой, но предпочтительнее чистый jax-rs.

@Context и @Provider, как определено в спецификациях jax-rs
maress 03.08.2018 12:26

Не могли бы вы уточнить немного подробнее?

RegRog 03.08.2018 17:08

Есть взлом с использованием @Path. Кроме этого, нет чистого JAX-RS способа. JAX-RS не определяет никаких функций внедрения, потому что он является частью Java EE, а в Java EE уже есть CDI. Любое решение (без CDI) будет зависеть от реализации.

Paul Samsotha 03.08.2018 19:08

Хорошо, теперь я понимаю ситуацию. Итак, как может быть возможное решение с CDI?

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

Ответы 1

Ответ принят как подходящий

Я нахожу это решение с помощью CDI:

@ApplicationScoped
public class MyFactoryOrSupplier {

    @Produces
    @RequestScoped
    public IMyClass getMyClass(@Context HttpServletRequest request) {
        return (IMyClass) request.getAttribute("MyInjectedClass");
    }
}

а затем в моих сервлетах:

@Inject
protected IMyClass myClass;

beans.xml

bean-discovery-mode = "annotated"

На самом деле MyClass implements IMyClass, потому что я не знаю, что у MyClass есть общедоступный конструктор без аргументов, и это помогло.

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