假设我有一个使用一些HTTP头参数调用的Web服务/ REST资源。资源方法构建一个复杂的数据对象(当前是POJO)并最终将其返回给客户端(通过Gson作为JSON,但这并不重要)。
所以我有这个调用层次结构:
@Path(foo) ProjectResource @GET getProject()
-> new Project()
-> new List<Participant> which contains lots of new Participant()s
-> new Affiliation()
如果我希望Affiliation
对象是例如根据标题参数填充英语或德语,我必须将其作为链中的参数传递。 我想避免这样做。也许这基本上是不可能的,但它感觉非常错误。所有这些对象只存在于请求中,因此从任何地方访问与请求相关的信息都不方便吗?
我希望我可以,例如定义一个初始化自身的CDI @RequestScoped
对象(或由某个WebFilter填充),然后我可以在需要它的地方注入。
但很明显,这并不适用于POJO内部,而且我也无法从请求范围内的对象中获取头文件。
我已经阅读了很多有关EJB和JAX-RS上下文和CDI的SO问题/答案,但我无法理解它。
我期待太多了吗?传递参数确实是首选选项吗?
答案 0 :(得分:4)
如果我理解你需要什么,你可以尝试以下方法(只是从我的头脑中写下这个解决方案,但它应该有效):
定义一个用@RequestScoped
注释的类,它将存储您需要的数据:
@RequestScoped
public class RequestMetadata {
private Locale language;
// Default constructor, getters and setters ommited
}
确保您使用@RequestScoped
包中的javax.enterprise.context
注释。
创建ContainerRequestFilter
以填充RequestMetadata
:
@Provider
@PreMatching
public class RequestMetadataFilter implements ContainerRequestFilter {
@Inject
private RequestMetadata requestMetadata;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestMetadata.setLanguage(requestContext.getLanguage());
}
}
然后,您最终可以使用@Inject
RequestMetadata
的注入
@Stateless
public class Foo {
@Inject
private RequestMetadata requestMetadata;
...
}
请注意任何地方 太宽:注入将在容器管理的bean中运行,例如servlet,JAX-RS类,EJB和CDI例如,豆子。
您无法对自己创建的bean进行注入,也无法对JPA实体进行注入。