可以使用@Context注释在资源方法参数中注入类似HttpHeaders对象的东西.由于该对象基于请求参数(当然,HTTP标头),我提出了创建我自己的可注入User对象的想法,该对象是根据请求中存在的有效令牌创建的(类似于OAuth访问)令牌).
所以,我希望实现这样的目标:
@Path("/resources") public class MyResource { @Path("/{id}") @GET public Response getById(@Context User user,@PathParam("id") long id) { ... } }
其中User是基于请求参数创建的可注入对象,例如可通过HttpHeaders对象访问的对象.当然,如果由于任何原因无法创建User对象,则提供程序也可以抛出异常并返回HTTP错误响应.
现在,我的问题是:
>这是一个很好的设计吗?如果没有,我有哪些更好的选择?
>我怎样才能做到这一点?我不在乎我的解决方案是否特定于JAX-RS并且使用WildFly / RestEasy特定的内部,但我绝对更喜欢便携式解决方案(如果存在).
谢谢
解决方法
作为answered here你可以使用@Context和@Provider,但这不完全是你想要的.
使用Resteasy Dispatcher可以直接为每个@Context注入一个类.
但是在这里你必须注册应该注入的Object.我认为这对请求范围的参数没有意义.
您可以做的是注入这样的提供者:
// Constructor of your JAX-RS Application public RestApplication(@Context Dispatcher dispatcher) { dispatcher.getDefaultContextObjects().put(UserProvider.class,new UserProvider()); } // a resource public Response getById(@Context UserProvider userProvider) { User user = userProvider.get(); }
>注册WebFilter,验证用户,包装ServletRequest并覆盖getUserPrincipal.然后,您可以从注入的HttpServletRequest访问UserPrincipal.
>实现一个实现ContainerRequestFilter的JAX-RS拦截器.将ContainerRequestContext.html#setSecurityContext与UserPrincipal一起使用,并将SecurityContext注入ResourceMethod-Parameter.
>实现更新Method-Parameters的CDI-Interceptor.
>为您的用户实现一个类which produces并通过CDI注入它.
我把例子推到了github.