猿问

如何在持久化之前启用 Spring Bean 验证但忽略 HTTP 请求

这是我的场景


class B {

   @NotNull 

   String x;

}


class A {

    @Valid

    B b;


    @NotNull

    String y;

现在我的 Http POST 请求获得一个对象class A作为有效负载。String y应该在传入的 HTTP 请求中进行验证(并且在持久化到数据库之前也进行验证)。但是,String x不应在传入的 HTTP 请求中验证(并且仅在持久保存到 DB 之前验证),因为String x在请求中将为 null,并且其值将在完整class A对象持久保存之前由业务逻辑设置。


有什么办法可以做到这一点?


精慕HU
浏览 131回答 3
3回答

温温酱

如果可以编辑这些对象,则可以使用验证组;class B {&nbsp; &nbsp; @NotNull(groups = Ignored.class)&nbsp; &nbsp; String x;}class A {&nbsp; &nbsp; @Valid&nbsp; &nbsp; B b;&nbsp; &nbsp; @NotNull&nbsp; &nbsp; String y;}&nbsp;在哪里Ignored;import javax.validation.groups.Default;public interface Ignored extends Default {}如果你的控制器没有定义这个组,它下面的任何注释都将被忽略,因此你的要求将得到满足,请求中的验证B.x将被忽略,但其他字段A将被验证。但我不是 100% 确定验证将在数据库端应用,你可以试试吗?否则你可以尝试做;@RestControllerpublic class Controller {&nbsp; &nbsp; @PostMapping("/etc")&nbsp; &nbsp; ResponseEntity<String> addA(@RequestBody A a) { //disabled validation here&nbsp; &nbsp; &nbsp; &nbsp; B tempB = a.getB();&nbsp; &nbsp; &nbsp; &nbsp; a.setB(null);&nbsp; &nbsp; &nbsp; &nbsp; validateA(a);&nbsp; &nbsp; &nbsp; &nbsp; a.setB(tempB);&nbsp; &nbsp; &nbsp; &nbsp; // continue logic&nbsp; &nbsp; }}在哪里validateA();import org.springframework.validation.annotation.Validated;@Validatedpublic class Validator {&nbsp; &nbsp; public void validateA(@Valid A a) {&nbsp; &nbsp; &nbsp; &nbsp; // nothing here&nbsp; &nbsp; }}这是一个丑陋的解决方案,但仍然是一个解决方案......

HUH函数

我认为您缺少在将在控制器层中验证的参数上添加 @Vaild 注释。@RestControllerpublic class AController {&nbsp; &nbsp; @PostMapping("/a")&nbsp; &nbsp; ResponseEntity<String> addA(@Valid @RequestBody A a) {&nbsp; &nbsp; &nbsp; &nbsp; // persisting the a entity&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return ResponseEntity.ok("A is valid");&nbsp; &nbsp; }}

qq_遁去的一_1

实际上,如果“@Valid”注释没有作为参数前缀,它不会影响,@Jonathan 解释道。要在持久化之前启用验证,它的工作方式如下:@Repository@Validatedpublic MyDao {&nbsp; &nbsp; public void insertA(@Valid A a){&nbsp; &nbsp; &nbsp; &nbsp; //logic here&nbsp; &nbsp; }}@Validated(org.springframework.validation.annotation.Validated) 是启用参数验证的关键。这个对我有用。
随时随地看视频慕课网APP

相关分类

Java
我要回答