【问题标题】:How do you accept a List<E> or an array E[] into a REST endpoint?如何将 List<E> 或数组 E[] 接受到 REST 端点?
【发布时间】:2017-10-03 00:16:17
【问题描述】:

我想要一个通用的批量更新调用,客户端发送一个对象数组供我更新。请求的正文如下所示:

请求正文

[
  {
    "id": 1,
    "name": "noe",
    "phone": "1234"
  },
  {
    "id": 2,
    "name": "noea",
    "phone": "1235"
  }
]

我环顾四周,似乎大多数编组提供商都可以在请求正文中处理此问题。我尝试了几种不同的方法:

E[ ] 或列表 参数

如何打开它试图读取的流?我错过了一些注释还是有错误的@Consumes 注释?我进行了一些搜索,但找不到任何描述我遇到的问题的内容。

    @PUT
    @Consumes( MediaType.APPLICATION_JSON )
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "/multiedit" )
    public Response edit( E[] objects ) {

    }

或者

    @PUT
    @Consumes( MediaType.APPLICATION_JSON )
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "/mutliedit" )
    public Response edit( List<E> entities ) {

    }

生产

javax.json.JsonException: Unable to detect charset due to Stream closed
root cause: java.io.IOException: Stream closed

包装类

之后我尝试将数组打包到包装类中。

public class EntityList<E> implements Serializable {
    private List<E> entities;
}

@PUT
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
@Path( "/multiedit" )
public Response edit( EntityList<E> entities ) 
{

}

这会导致我的映射器 API Johnzon Mapper 出现映射异常。

org.apache.johnzon.mapper.MapperException: Unsupported [<list of objects here>] com.my.project.EntityList<E>

我只想接受一个对象数组。我在herehere 等一系列不同的问题中看到了它,但它对我不起作用。

更新: 如果我做一个非通用版本,我可以让前两个选项工作。如果我将它的通用版本子类化并尝试覆盖它,它仍然会死掉,并出现与所述相同的异常。

【问题讨论】:

  • 您是否配置了合适的阅读器来进行对象解析?我相信this线程可以帮助你。

标签: java arrays json rest request


【解决方案1】:

你必须使用@RequestBody链接这个:

@PUT
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
@Path( "/multiedit" )
public Response edit(@RequestBody EntityList<E> entities ) 
{


}

【讨论】:

  • 如果我没记错的话,我认为 RequestBody 仅适用于 Spring;我们没有使用 Spring
【解决方案2】:

是的,我相信您缺少 @QueryParam 注释。

@PUT
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
@Path( "/multiedit" )
public Response edit( @QueryParam("entities") EntityList<E> entities ) 
{

}

【讨论】:

  • QueryParam 用于 URL 上的参数,例如:/?name=bob。
  • 我不确定他是如何PUT他的名单,但你也可以建立一个@QueryParams的名单。无论如何,也许他应该使用@UriInfo
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2015-01-27
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多