【问题标题】:JSON unmarshalling with Moxy in ContainerResponseFilter在 ContainerResponseFilter 中使用 Moxy 解组 JSON
【发布时间】:2014-05-21 14:13:23
【问题描述】:

我在我的 Jersey (2.7) 项目中使用 Moxy 基本上只是为了在服务发出响应时将我的对象编组为 JSON。它工作正常,但现在我也在使用 ContainerResponseFilter 对发出的每个响应进行一些更改,我不确定如何将请求正文的内容解组为一个对象,这是我需要的。

具体来说:

  • 我刚刚在ResourceConfig 实例中注册了 Moxy:register(MOXyJsonProvider.class)
  • 一个类正在使用 JAXB 注释,因此当我在 Response.entity() 中设置该类的一个实例时,它会正确转换为 JSON
  • 当我将请求体(也是 JSON)设置为方法参数时,它也会被解组到一个对象中,例如:

    @Consumes(MediaType.APPLICATION_JSON) public Response getSomething( MyClass instance ) {

但是在 ContainerResponseFilter 中,我可以像这样访问请求正文,

InputStream body = requestContext.getEntityStream()

但我不确定是否可以将其自动转换为对象。我需要的信息比较简单,所以我想我可以用另一种方式解析JSON,但我很好奇。

我尝试过搜索,但没有找到。

【问题讨论】:

    标签: java json jaxb jersey moxy


    【解决方案1】:

    在您的 ContainerReponseFilter 中,您可以执行以下操作:

    public class ApplicationResponseFilter implements ContainerResponseFilter {
    
        @Override
        public void filter(final ContainerRequestContext request,
            final ContainerResponseContext response) throws IOException {
    
            // your code
            response.getEntity();
    
        }
    }
    

    将其转换为带有 JAXB 注释的对象。我没有在我的 responseFilter 中这样做,但我刚刚调试它并且它可以工作。

    【讨论】:

    • 这正是我正在做的,实际上它对我有帮助,非常感谢。我忘记了我的回复中已经有了对象,昨天漫长的一天。但是通常您知道是否可以从请求正文中解组 InputStream?
    • 对不起,你的意思是首先请求,我回答了你的回复。我认为您无法在 responseFilter 中轻松解组它。我一直在调试并查看堆栈,但没有找到简单的方法。但是,您需要从请求中获得什么信息?您可以添加一个 requestFilter 并将信息放入请求上下文中。您有可用的 requestContext.setSecurityContext(...) 但也有 requestContext.setProperty(...)
    • 请求中有一些信息我想发回给用户。但在我需要它的情况下,它已经在响应中,所以效果很好。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2012-06-13
    相关资源
    最近更新 更多