Java 是否可以从RestEASY MessageBodyReaderInterceptor中的MessageBodyReaderContext获取@PathParam或@QueryParam?
我的服务:Java 是否可以从RestEASY MessageBodyReaderInterceptor中的MessageBodyReaderContext获取@PathParam或@QueryParam?,java,rest,parameters,resteasy,interceptor,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,
@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并基于参数将其存储在单独的审计系统中。也许预处理拦截器/后处理拦截器是更好的选择
当xml仍可用于预处理时,是否有任何提示或替代方法来获取参数
Miguel我不是这方面的专家,但在我看来,
MessageBodyReaderContext
接口似乎不知道它是在服务器端还是客户端,因此它无法公开请求或其参数/路径部分等
据我所知,这是不可能的
如果您的代码知道它位于其余代码的服务器端
通信,也许您可以使用servlet过滤器来存储请求
在ThreadLocal中,然后在请求发出时从那里访问它
已处理,有点类似于spring框架中的RequestContextFilter
/RequestContextHolder
?(然后,请求对象不知道有关服务注释的任何信息,但必须从请求中手动提取信息。这意味着在两个位置具有相同的信息,因此必须有更好的解决方案……)
Edit:在看了一些示例后,我有一种模糊的感觉,如果您想读取输入流以创建对象并向其添加路径参数,MessageBodyReaderInterceptor
根本不是一种方法。相反,设置一个MessageBodyReader
,它从请求主体数据构造对象,然后将其传递到公共字符串setData(@PathParam(“id”)Long is,MyObject payload)
,假设此方法使用@Consumes
注释,该注释与MessageBodyReader
的@consumesime
注释相匹配。您可以在setData
中设置从请求主体读取的对象上缺少的id。这里有一些与此相关的示例:(但对于Jersey,不是jBoss:-/)
但是我不确定这是否对你有效,我也觉得我完全高估了自己恰当回答这个问题的能力,因此,我希望更有知识的人能提供更好的解决方案。我不是这方面的专家,但在我看来,
MessageBodyReaderContext
接口似乎不知道它是在服务器端还是客户端,因此它无法公开请求或其参数/路径部分等
据我所知,这是不可能的
如果您的代码知道它位于其余代码的服务器端
通信,也许您可以使用servlet过滤器来存储请求
在ThreadLocal中,然后在请求发出时从那里访问它
已处理,有点类似于spring框架中的RequestContextFilter
/RequestContextHolder
?(然后,请求对象不知道有关服务注释的任何信息,但必须从请求中手动提取信息。这意味着在两个位置具有相同的信息,因此必须有更好的解决方案……)
Edit:在看了一些示例后,我有一种模糊的感觉,如果您想读取输入流以创建对象并向其添加路径参数,MessageBodyReaderInterceptor
根本不是一种方法。相反,设置一个MessageBodyReader
,它从请求主体数据构造对象,然后将其传递到公共字符串setData(@PathParam(“id”)Long is,MyObject payload)
,假设此方法使用@Consumes
注释,该注释与MessageBodyReader
的@consumesime
注释相匹配。您可以在setData
中设置从请求主体读取的对象上缺少的id。这里有一些与此相关的示例:(但对于Jersey,不是jBoss:-/)
然而,我不确定这是否适用于你,我也觉得我完全高估了自己恰当回答这个问题的能力,所以我希望有更博学的人能提出更好的解决方案。我今天也遇到了同样的问题。我在
read()
方法中需要@PathParam
和@QueryParam
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");
...
}
}
公共类MyInterceptor实现预处理侦听器MessageBodyReaderInterceptor
{
私有静态ThreadLocal uri=new ThreadLocal();
公共服务器响应预处理(HttpRequest请求,ResourceMethod)
{
set(request.getUri);
...
}
公共对象读取(MessageBodyReaderContext上下文)
{
字符串param=uri.get().getPathParameters().getFirst(“myidparam”);
...
}
}
虽然现在考虑一下-我不太确定,如果只是使用
预拦截器
/后处理器拦截器
,也能解决我(可能还有你)的问题。明天我再看一看。我今天遇到了同样的问题。我在read()
方法中需要@PathParam
和@QueryParam
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");
...
}
}
公共类MyInterceptor实现预处理侦听器MessageBodyReaderInterceptor
{
私有静态ThreadLocal uri=new ThreadLocal();
公共服务器响应预处理(HttpRequest请求,ResourceMethod)
{
set(request.getUri);
...
}
公共对象读取(MessageBodyReaderContext上下文)
{
字符串param=uri.get().getPathParameters().getFirst(“myidparam”);
...
}
}
虽然当想到