繁体   English   中英

Spring REST - 将 GET 参数绑定到嵌套对象列表

[英]Spring REST - binding GET parameters to list of nested objects

我的问题几乎是1:1的这一个 我唯一的区别(和挣扎)是我的“数据容器”有一组对象。 它看起来像这样:

public class A {
    int plainFieldA;
    B fieldB;
    List<B> collectionB = new ArrayList<>();
}

public class B {
    int plainFieldB;
}

@Transactional(readOnly = true)
@GetMapping("")
public Entity getAll(A reqParam) {
    return getAll(reqParam);
}

是否可以在不创建转换器的情况下在 url http://localhost/api/test?plainFieldA=1参数中定义collectionB @GameSalutes 正确地指出,从 spring 4我们可以执行fieldB.plainFieldB=2所以 url 将是: http://localhost/api/test?plainFieldA=1&fieldB.plainFieldB=2但问题是我们可以做类似的事情collectionB没有创建转换器?

是的,您可以像这样提出请求:

http://localhost/api/test?plainFieldA=1&fieldB.plainFieldB=2&collectionB[0].plainFieldB=9

或者为邮递员编码请求:

http://localhost/api/test?plainFieldA=1&fieldB.plainFieldB=2&collectionB%5B0%5D.plainFieldB=9

请求两个对象:

http://localhost/api/test?plainFieldA=1&fieldB.plainFieldB=2&collectionB%5B0%5D.plainFieldB=9&collectionB%5B1%5D.plainFieldB=11

IDE中带断点的结果:

在此处输入图片说明

接受的答案就像一个魅力,但如果有人达到 url 大小限制或其他原因,我会添加这个答案作为替代方案。

按照这个线程建议,这是我的做法。

  • 前端:将您的对象字符串化而不是将其编码为 base64 以提交。
  • 后端:解码 base64 字符串,然后将字符串 json 转换为所需的对象。

它不是用邮递员调试 API 的最佳选择,但它按我的预期工作。

原始对象: {页面:1,大小:5,过滤器:[{字段:“id”,值:1,比较:“EQ”}

编码对象: eyJwYWdlIjoxLCJzaXplIjo1LCJmaWx0ZXJzIjpbeyJmaWVsZCI6ImlkUGFyZW50IiwiY29tcGFyaXNvbiI6Ik5VTEwifV19

@GetMapping
fun list(@RequestParam search: String?): ResponseEntity<ListDTO> {
    val filter: SearchFilterDTO = decodeSearchFieldDTO(search)
    ...
}

private fun decodeSearchFieldDTO(search: String?): SearchFilterDTO {
    if (search.isNullOrEmpty()) return SearchFilterDTO()
    return Gson().fromJson(String(Base64.getDecoder().decode(search)), SearchFilterDTO::class.java)
}

这里是 SearchFilterDTO 和 FilterDTO

class SearchFilterDTO(
    var currentPage: Int = 1,
    var pageSize: Int = 10,
    var sort: Sort? = null,
    var column: String? = null,
    var filters: List<FilterDTO> = ArrayList<FilterDTO>(),
    var paged: Boolean = true
)

class FilterDTO(
    var field: String,
    var value: Any,
    var comparison: Comparison
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM