【问题标题】:Does javax validation work with inheritance?javax 验证是否适用于继承?
【发布时间】:2021-01-02 22:30:34
【问题描述】:

我正在尝试验证一个模型,该模型继承自另一个模型,并且此父模型具有 @NotBlank 注释来验证参数。但是这个验证在接受子类对象列表的控制器中被绕过了。

sn-p 代码应该可以很好地了解场景

public abstract class A {
  @NotBlank
  private String name;
}

public class B extends A {
  private String type;
}

@PostMapping(consumes= MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity saveRoles(@Valid @RequestBody List<B> roles){
   // ideally it should not land here if request has blank name. But it seems to land here.
   // logic 
}

请求正文 -

[
    {
        "name": "",
        "type": "system"
    }
]

【问题讨论】:

  • 是的,应该这样,问题与未处理的注释无关,而是与javax.validation 的工作方式有关。您还需要将@Valid 放在列表中的&lt;B&gt; 上。所以List&lt;@Valid B&gt;。当您接受一个集合时,它需要知道它应该传播验证。

标签: java spring javax.validation


【解决方案1】:

您试图验证集合本身,而不是集合元素。试试这个:

@PostMapping(consumes= MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity saveRoles(@RequestBody List<@Valid B> roles){
  
}

【讨论】:

  • 嗨@donquih0te 这取决于spring-boot版本吗?我得到这个适用于 2.2.4 但它不适用于我现有的版本 2.0.3
  • @Chiku 你能不能去@Valid注解源代码检查ElementType.TYPE_USE是否存在于@Target
  • 是的,它存在。由于我有时间限制,我通过为列表构建一个包装 Java bean 来让它工作。我提到了这个链接 - link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多