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

时间:2013-02-13 11:31:22

标签: java rest parameters resteasy interceptor

我的服务:

@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仍可用于预处理时获取参数的任何提示或替代方法?

米格尔

2 个答案:

答案 0 :(得分:1)

我今天偶然发现了同样的问题。我需要@PathParam方法中的@QueryParamread() s,结果是这样的:

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也可以解决我(也许是你的)问题。我明天再看看。

答案 1 :(得分:0)

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

据我所知,这是不可能的。

如果您的代码知道它存在于其余部分的服务器端 通信,也许您可​​以使用servlet过滤器来存储请求 在ThreadLocal中,然后在请求时从那里访问它 处理,有点类似于Spring框架中的RequestContextFilter / RequestContextHolder? (然后请求对象不知道有关服务注释的任何信息,而是必须从请求中手动提取信息。这意味着在两个地方拥有相同的信息,因此必须有一个更好的解决方案.. 。)

编辑:在查看了一些示例后,我感到模糊的感觉,如果您想要读取输入流来创建对象并向其添加路径参数,MessageBodyReaderInterceptor根本就不是要走的路。而是设置一个MessageBodyReader,它从请求正文数据中构造对象,然后将其传递到public String setData(@PathParam("id") Long is, MyObject payload),假设此方法使用与@Consumes匹配的@ConsumeMime进行注释{1}} {1}}的注释。您可以在MessageBodyReader中为从请求正文中读取的对象设置缺少的ID。与此相关的一些例子似乎在这里:How to get full REST request body using Jersey?(但对泽西岛而言,不是jBoss: - /)

但是我不确定这是否适合你,我也觉得我完全高估了我能够恰当回答这个问题的能力,所以我希望有更多知识渊博的人能够提供更好的解决方案。