繁体   English   中英

是否可以在RestEASY MessageBodyReaderInterceptor中从MessageBodyReaderContext获取@PathParam或@QueryParam?

[英]Is it possible to get a @PathParam or @QueryParam from the MessageBodyReaderContext in a RestEASY MessageBodyReaderInterceptor?

我的服务:

@POST
public String setData(@QueryParam("id") Long is, MyObject payload) {
...
}

or

@POST
public String setData(@PathParam("id") Long is, MyObject payload) {
...
}

我在服务器上的拦截器:

Object read(MessageBodyReaderContext context) throws IOException, WebApplicationException {

Class mypayloadtype = context.getType;

InputStream mypayloadinpustream = context.getInputStream();


Long myidparam = ???????? // how to get the query or path param here?

}

编辑:更具体一点:

我想做的是获取XML并根据参数将其存储在单独的审核系统中。 也许PreProcessInterceptor / PostProcessInterceptor是更好的选择?

当xml仍可用于预处理时,是否有任何提示或替代方法来获取参数?

米格尔

我今天偶然发现了同样的问题。 我需要在read()方法中使用@PathParam@QueryParam ,最终得到如下所示:

public class MyInterceptor implements PreProcessInterceptor, MessageBodyReaderInterceptor
{
    private static ThreadLocal<UriInfo> uri = new ThreadLocal<UriInfo>();

    public ServerResponse preProcess(HttpRequest request, ResourceMethod method)
    {
         uri.set(request.getUri);
         ...
    }

    public Object read(MessageBodyReaderContext context)
    {
        String param = uri.get().getPathParameters().getFirst("myidparam");
        ...
    }
}

尽管现在考虑时-我不太确定,但是仅使用PreProcessInterceptor / PostProcessInterceptor是否也可以解决我(也许是您的)问题。 我明天再看。

我不是该主题的专家,但在我看来, MessageBodyReaderContext接口似乎并不真正知道它是在服务器端还是在客户端,因此它无法公开请求或其参数/路径部分等。

据我所知这是不可能的。

如果您的代码知道它驻留在其余通信的服务器端,则可以使用servlet过滤器将请求存储在ThreadLocal中,然后在处理请求时从那里访问它,这有点类似于Servlet中的RequestContextFilter / RequestContextHolder 。春天的框架? (然后,请求对象对服务的注释一无所知,而是必须从请求中手动提取信息。这意味着在两个位置具有相同的信息,因此必须有一个更好的解决方案。 )

编辑 :在看了一些示例后,我感到含糊其辞,如果您想读取输入流以创建对象并向其添加路径参数, MessageBodyReaderInterceptor根本不是路要走。 而是设置一个MessageBodyReader ,它从请求正文数据构造该对象,然后将其传递到public String setData(@PathParam("id") Long is, MyObject payload) ,假设此方法用@Consumes注释。 @Consumes其匹配@ConsumeMime的注解MessageBodyReader 在那里,您可以在setData中设置从请求主体读取的对象上缺少的ID。 与此相关的一些示例似乎在这里: 如何使用Jersey获得完整的REST请求主体? (但对于Jersey,不是jBoss:-/)

但是,我不确定这是否对您有用,并且我还感到自己完全高估了正确回答此问题的能力,因此我希望有更多知识的人能提供更好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM