Есть ли способ достичь того же результата, описанного здесь, не в зависимости от джерси, а только от 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.
Не могли бы вы уточнить немного подробнее?
Есть взлом с использованием @Path
. Кроме этого, нет чистого JAX-RS способа. JAX-RS не определяет никаких функций внедрения, потому что он является частью Java EE, а в Java EE уже есть CDI. Любое решение (без CDI) будет зависеть от реализации.
Хорошо, теперь я понимаю ситуацию. Итак, как может быть возможное решение с CDI?
Я нахожу это решение с помощью 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
есть общедоступный конструктор без аргументов, и это помогло.
@Context
и@Provider
, как определено в спецификациях jax-rs