1

我的服务:

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

米格尔

4

2 回答 2

1

我今天偶然发现了同样的问题。我需要方法中的@PathParams 和@QueryParamsread()并最终得到如下内容:

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

于 2013-02-21T20:52:00.307 回答
0

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

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

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

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

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

于 2013-02-13T18:12:29.023 回答