Java 将实体记录为JSON作为响应

Java 将实体记录为JSON作为响应,java,jakarta-ee,jersey,Java,Jakarta Ee,Jersey,我是新泽西州的新手,需要记录JSON响应。我希望获取实体并将其转换为JSON,就像Jersey框架所做的那样(相同的映射器,等等)。有没有办法提取其映射器(并调用,例如,其writeValueAsString)?您没有指定用于生成JSON响应的包(也没有详细解释jersey服务器),但我假设您使用的是Jackson 你们在泽西岛有一些追踪,看一看,但据我所知,它并不能满足你们的需要 但首先,您应该实现一个LoggingFilter public class YourLoggingFilter i

我是新泽西州的新手,需要记录JSON响应。我希望获取实体并将其转换为JSON,就像Jersey框架所做的那样(相同的映射器,等等)。有没有办法提取其映射器(并调用,例如,其writeValueAsString)?

您没有指定用于生成JSON响应的包(也没有详细解释jersey服务器),但我假设您使用的是
Jackson

你们在泽西岛有一些追踪,看一看,但据我所知,它并不能满足你们的需要

但首先,您应该实现一个
LoggingFilter

public class YourLoggingFilter implements ContainerResponseFilter {

    @Override
    public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext)
            throws IOException {
        ...

    }

}
我假设您扩展了
ResourceConfig
类来添加资源,您需要在这里添加新的过滤器:

public class YourApplication extends ResourceConfig {

    public YourApplication() {
        super();

        register(YourAuthenticationRequestFilter.class, Priorities.AUTHENTICATION);
        register(YourExceptionMapper.class);
        register(YourLoggingFilter.class);

        packages("...");
    }
}
最后,在
YourLoggingFilter
中记录响应的一个简单方法是(这里我假设
Jackson
,但这只是一个例子,我不知道您使用的是什么记录器,但不要每次请求时都打开文件!!!)


希望能有所帮助。

谢谢,基本上我也完成了一些类似的事情,但你“跌倒”的地方正是我“跌倒”的地方:专注于你的LoggingFilter的实现你正在使用ObjectMapper,但我希望使用与Jersey infra完全相同的mapper。您假设Jersey正在使用它,但如果明天有人会更改它,而此日志代码仍在使用特定的实现呢?具体地说,我发现实际响应会修剪null元素,而使用ObjectMapper则不会。所以这里有一个区别。我怎样才能使用与真实响应相同的映射器呢?好吧,我想,你真的需要深入服务器内部去做这件事。。。。如果有帮助,请查看
ServerRuntime
方法
writeResponse
,至少在我的版本中是这样,但它似乎有点难,需要创建很多对象。我想知道你为什么需要完全相同的,但这是相当努力的。顺便说一下,如果你已经有了一个解决方案,即使它是不完整的,我建议你把它和你的问题一起发布,这样你就可以避免有人建立一个你已经有了的答案。。。就我而言,没花多少时间。无论如何,这只是一个建议。干杯。好的,谢谢。我认为有一种更简单的方法可以提取“与响应使用的映射器相同的映射器”。对不起,让你困惑了,我只是想问一下地图绘制者,假设我有ContainerResponseContext,并不是想误导你,我不知道如何得到它。谢谢。我不是说你必须接受答案。事实上,这并不是对你的问题(即你问题的其他方面)的回答。如果你愿意,你可以“拒绝”它。我唯一想说的是问题越窄越好。。。。事实上,我没有花太多时间来写我的答案。再次感谢。我接受了它,因为它可能会帮助那些不知道如何获取响应对象的人:)
Object obj = responseContext.getEntity();
ObjectMapper om = new ObjectMapper();
File file = new File("...");
try {
    OutputStream out = new FileOutputStream(file);
    om.writeValue(out, obj);
} catch (IOException e) {
    // this could fail but you don't want your request to fail
    e.printStackTrace();
}