问题描述
我正在尝试开发一个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消息。
我的问题是:
- 为什么不能放置两个或多个参数?那是因为Json代表消息的正文部分,而我只能拥有一个正文吗?你能给我更好的解释吗?
- 我可以创建一个包含我的参数的DTO,并将此DTO用作POST方法的一个也是唯一的参数,但这是最佳做法吗?这样做,我将为每个POST方法都有一个DTO,它实际上充当包装器。
- 我想念什么吗?
非常感谢您的宝贵时间, 祝你有美好的一天。
解决方法
为什么不能放置两个或多个参数?那是因为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验证。