3

要求 我正在构建一个 REST API。它有两个 REST 调用。调用 /format 根据提供的参数输出格式化的 JSON。具有相同参数的调用 /raw 应该输出带有原始值的 JSON(不带格式)。此处的格式将是特定于区域设置的,例如日期更改、显示正确的货币、十进制格式、时间格式等值。

工具 Java、Tomcat、Spring、Apache CXF、JAX-RS 和 Jackson。

实施 REST 服务已设置并且工作正常。那里没有问题。我编写了单独的自定义序列化程序,在其中我使用 NumberFormat、DateFormat、DecimalFormat 等提供所需的格式。我扩展了 Jackson 的 SimpleModule 以注册上面提到的所有自定义序列化程序。我正在使用两个单独的 ObjectMapper(FomatOM 和 RawOM)。FormatOM 为格式化的 JSON 输出注册自定义模块,RawOM 根据要求用于原始 JSON 输出。这两个对象映射器注册到两个不同的 JacksonJsonProviders 并在我的 spring 配置 xml 中声明为 bean。对于 /format,我使用带有自定义序列化程序的 FormatOM,在 /raw 中我使用 RawOM。

问题 它不像我预期的那样工作。我希望当我通过 /format 调用发出请求时,将使用 FormatOM 并使用 /raw RawOM。发生的情况是,无论我先拨打哪个电话,后续电话都将使用相同的 ObjectMapper。因此,如果第一个调用是 /raw;随后对 /format 或 /raw 的调用呈现原始 JSON 输出。Tomcat 重新启动后,如果第一次调用是 /format,那么随后对任一 API 调用的调用都会呈现格式化的 JSON 输出

问题 1. 你们如何实现我对渲染格式化+原始 JSON 输出的要求?2. 我的实现有什么问题?3. 有什么想法、建议或批评吗?4. 还有其他方式来获得基于请求的映射器吗?

谢谢

4

2 回答 2

0

感谢您的回答 StaxMan。由于我使用的是 Spring,因此我决定注入 JacksonJsonProviderJacksonJsonProvider.setMapper(mapper)设置每个请求的映射器。如果有人尝试过上述方法并遇到问题,请告诉我。如果我遇到任何问题,我会更新这个答案。

于 2012-11-30T12:08:02.047 回答
0

一种解决方法是只使用 a StreamingOutput,并在其中捆绑特定ObjectMapper,直接使用它 ( ObjectMapper.writeValue(output, value);)

于 2012-11-21T23:58:19.193 回答