[英]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.