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

时间:2019-12-09 20:49:11

标签: java spring spring-boot

我的问题与this one差不多是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 collectionB的参数中定义http://localhost/api/test?plainFieldA=1而无需创建转换器? @GameSalutes正确地指出,自春季4以来,我们可以进行fieldB.plainFieldB=2,因此网址为:http://localhost/api/test?plainFieldA=1&fieldB.plainFieldB=2,但问题是我们可以与collectionB做类似的事情而不创建一个转换器?

2 个答案:

答案 0 :(得分:2)

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

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中带有断点的结果:

enter image description here

答案 1 :(得分:0)

接受的答案就像一个咒语,但是如果有人达到URL大小限制或其他原因,我将添加此答案作为替代。

按照this thread的建议,这是我的工作方式。

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

用邮递员调试您的API并不是最好的方法,但它对我来说可以正常工作。

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

编码对象: eyJwYWdlIjoxLCJzaXplIjo1LCJmaWx0ZXJzIjpbeyJmaWVsZCI6ImlkUGFyZW50IiYYY29tcGFyaXNvbiI6Ik5VTEwifV19

@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
)