【问题标题】:How to use multiple JSON providers with CXF, Spring and Jackson如何在 CXF、Spring 和 Jackson 中使用多个 JSON 提供程序
【发布时间】:2012-11-10 07:44:52
【问题描述】:

要求 我正在构建一个 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. 还有其他方法可以拥有基于请求的映射器吗?

谢谢

【问题讨论】:

  • 只是在玩代码,我将尝试自动装配 JacksonJsonProvider 并根据请求注入映射器。如果它对我有用,会报告。

标签: java spring cxf jackson jax-rs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      相关资源
      最近更新 更多