我的服务:
@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仍可用于预处理时获取参数的任何提示或替代方法?
米格尔
答案 0 :(得分:1)
我今天偶然发现了同样的问题。我需要@PathParam
方法中的@QueryParam
和read()
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: - /)
但是我不确定这是否适合你,我也觉得我完全高估了我能够恰当回答这个问题的能力,所以我希望有更多知识渊博的人能够提供更好的解决方案。