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”);
...
}
}
虽然当想到