如何创建没有球衣的 "Custom Injection Provider"(工厂)
How to create a "Custom Injection Provider" (factory) without jersey
有没有一种方法可以实现 here 描述的相同结果,而不是依赖球衣而是纯粹的 jax-rs?我想创建一个像 Jersey 这样的自定义注入提供程序,这样我就可以注入 MyClass 从 HttpServletRequest
中提取自定义数据
@Inject
protected MyClass myClass;
我还发现 很有用,它与 java.util.function.Supplier
的工作原理相同,但此代码中仍然需要 Jersey:
bindFactory(MyFactoryOrSupplier.class)
.to(MyClass.class)
.in(RequestScoped.class);
编辑:
CDI 也是一个不错的选择,但是纯 jax-rs 更可取
我使用 CDI 找到了这个解决方案:
@ApplicationScoped
public class MyFactoryOrSupplier {
@Produces
@RequestScoped
public IMyClass getMyClass(@Context HttpServletRequest request) {
return (IMyClass) request.getAttribute("MyInjectedClass");
}
}
然后在我的 servlet 中:
@Inject
protected IMyClass myClass;
beans.xml
bean-discovery-mode="annotated"
实际上 MyClass implements IMyClass
因为我不知道 MyClass
有一个没有参数的 public 构造函数,这就成功了。
有没有一种方法可以实现 here 描述的相同结果,而不是依赖球衣而是纯粹的 jax-rs?我想创建一个像 Jersey 这样的自定义注入提供程序,这样我就可以注入 MyClass 从 HttpServletRequest
中提取自定义数据@Inject
protected MyClass myClass;
我还发现 java.util.function.Supplier
的工作原理相同,但此代码中仍然需要 Jersey:
bindFactory(MyFactoryOrSupplier.class)
.to(MyClass.class)
.in(RequestScoped.class);
编辑:
CDI 也是一个不错的选择,但是纯 jax-rs 更可取
我使用 CDI 找到了这个解决方案:
@ApplicationScoped
public class MyFactoryOrSupplier {
@Produces
@RequestScoped
public IMyClass getMyClass(@Context HttpServletRequest request) {
return (IMyClass) request.getAttribute("MyInjectedClass");
}
}
然后在我的 servlet 中:
@Inject
protected IMyClass myClass;
beans.xml
bean-discovery-mode="annotated"
实际上 MyClass implements IMyClass
因为我不知道 MyClass
有一个没有参数的 public 构造函数,这就成功了。