POST中使用多个参数时,JAX-RS JSON绑定反序列化错误

问题描述

我正在尝试开发一个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,它实际上充当包装器。
  3. 我想念什么吗?

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

解决方法

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

JAX-RS允许一个“实体”参数。此参数代表整个请求实体。由于没有任何注释 1 ,因此确定为实体参数。如果需要原始实体,则可以使用InputStream参数。如果您想要POJO,则可以这样做。转换的工作方式是使用MessageBodyReader。将根据Content-Type标头和参数类型选择阅读器。框架附带了一些易于转换类型的标准阅读器。例如String,InputStream,byte []。读取器将通过实体流,并且需要将流转换为参数类型。您可以阅读有关“实体提供者” here的更多信息。

如果要使用JSON之类的通用媒体类型,则可以使用一些库来处理JSON / POJO转换,并可以从该库中创建一个读取器。对于JSON,常见的诽谤是Jackson,Jackson团队提供了一个Jackson MessageBodyReader。

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

是的,这是非常普遍的做法。熟悉这些类型的框架。

有什么我想念的吗?

我不知道,你告诉我。


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