【问题标题】:Javax validation of generics in Springboot with Kotlin使用 Kotlin 对 Springboot 中的泛型进行 Javax 验证
【发布时间】:2021-10-06 01:53:04
【问题描述】:

我有一个控制器:

@PostMapping
fun create(
  @RequestBody @Valid request: MyContainer<CreateRequest>,
): MyContainer<Dto> = service.create(request.objects)

MyContainer 和 CreateRequest 看起来像这样:

class MyContainer<T>(
  @field:Valid // also tried param
  @field:NotEmpty(message = "The list of objects can not be null or empty")
  var objects: List<@Valid T>? = listOf(),
)
class CreateRequest(
  @field:NotNull(message = "Value can not be null")
  var value: BigDecimal? = null,
)

在我的测试中,“外部”验证有效,也就是说,如果我发送 { "objects": null }{ "objects": [] },我确实会收到预期的错误消息。但我无法让它验证列表的内容。根据我对 Java 的理解,List&lt;@Valid T&gt; 应该可以工作,但无论如何我无法让它在 kotlin 中工作。

我想我可能需要在 List&lt;@Valid T&gt; 中的 @Valid 上设置某种使用站点目标,但我找不到适用于此用例的目标。

我怎样才能使验证适用于列表?

【问题讨论】:

    标签: spring spring-boot validation kotlin generics


    【解决方案1】:

    我自己设法找到了解决方案。

    显然get: 是正确的使用站点目标,而不是field:param:。此外,List&lt;@Valid T&gt; 中的@Valid 不是必需的。

    作为参考,这里是工作类(也将其更改回数据类,因为这似乎不会造成问题)。

    class MyContainer<T>(
      @get:Valid
      @get:NotEmpty(message = "The list of objects can not be null or empty")
      var objects: List<T>? = listOf(),
    )
    

    和 CreateRequest:

    class CreateRequest(
      @get:NotNull(message = "Value can not be null")
      var value: BigDecimal? = null,
    )
    

    @Valid 需要更改为get: 使用站点目标,但我选择在任何地方使用它以保持一致性,因为它似乎是最有效的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多