【问题标题】:JAX-RS JSON Binding deserialization error when using multiple parameter in POST在 POST 中使用多个参数时出现 JAX-RS JSON 绑定反序列化错误
【发布时间】:2020-10-01 21:34:43
【问题描述】:

我正在尝试开发 Jax-RS POST 资源,报告如下:

@Path("testJson")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response testJson(Float firstValue, Float secondValue, String thirdValue) {

    LOG.info(" firstValue: " + firstValue);
    LOG.info(" secondValue: " + secondValue);
    LOG.info(" thirdValue: " + thirdValue);

    return Response.ok().build();
}

但是,我收到以下错误:

 RESTEASY002305: Failed executing POST /aliments/testJson: org.jboss.resteasy.spi.ReaderException: javax.ws.rs.ProcessingException: RESTEASY008200: JSON Binding deserialization error

四处搜索,我了解到对于接受 JSON 的 POST 方法,您只需给它一个参数,实际上就是整个 JSON 消息。

我的问题是:

  1. 为什么我不能放两个或更多参数?那是因为 Json 代表消息的正文部分,而我只能有一个正文吗?请您给我解释一下好吗?
  2. 我可以创建一个包含我的参数的 DTO,并将此 DTO 用作我的 POST 方法的唯一参数,但这是最佳实践吗?这样做,我将为每个 POST 方法都有一个 DTO,它实际上充当了一个 Wrapper。
  3. 我有什么遗漏吗?

非常感谢您的宝贵时间, 祝你有美好的一天。

【问题讨论】:

    标签: json post jax-rs backend json-deserialization


    【解决方案1】:

    为什么我不能放两个或更多参数?那是因为 Json 代表消息的正文部分,而我只能有一个正文吗?请您给我解释一下好吗?

    JAX-RS 允许一个“实体”参数。该参数代表整个请求实体。通过没有任何注解1确定为实体参数。如果您想要原始实体,可以使用InputStream 参数。如果你想要一个 POJO,你可以这样做。转换的工作原理是使用MessageBodyReaders。将根据 Content-Type 标头和参数类型选择阅读器。该框架带有一些标准阅读器,可轻松转换类型。例如字符串、输入流、字节[]。阅读器将获得实体流,它需要将流转换为参数类型。您可以阅读有关“实体提供者”here 的更多信息。

    如果您想使用像 JSON 这样的常见媒体类型,有一些库可以处理 JSON/POJO 转换,并且可以从该库中创建一个阅读器。对于 JSON,常见的库是 Jackson,Jackson 团队提供了一个 Jackson MessageBodyReader。

    我可以创建一个包含我的参数的 DTO,并将此 DTO 用作我的 POST 方法的唯一参数,但这是最佳实践吗?这样做,我将为每个 POST 方法都有一个 DTO,它实际上充当了一个 Wrapper。

    是的,这是很常见的做法。习惯使用这些类型的框架。

    我有什么遗漏的吗?

    我不知道,你告诉我。


    1。允许使用一些特殊的注释,例如 @Valid 用于 bean 验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多