如何在持续存在之前启用Spring Bean验证,但要忽略HTTP请求



这是我的方案

class B {
   @NotNull 
   String x;
}
class A {
    @Valid
    B b;
    @NotNull
    String y;
} 

现在,我的HTTP POST请求将class A的对象作为有效载荷。String y应在传入的HTTP请求中进行验证(并且在持续到DB之前也进行了验证(。但是,String x不应在传入的HTTP请求中验证(并且仅在持续到DB之前进行验证(,因为String x将在请求中无效,并且其值将由业务逻辑设置,然后在完整的class A持续存在之前。

有什么办法可以实现这一目标?

如果您可以编辑这些对象,则可以使用验证组;

class B {
    @NotNull(groups = Ignored.class)
    String x;
}
class A {
    @Valid
    B b;
    @NotNull
    String y;
} 

其中 Ignored是;

import javax.validation.groups.Default;
public interface Ignored extends Default {
}

如果您的控制器未定义该组,则将忽略其下的任何注释,因此您的要求将得到满足,在请求中将忽略B.x的验证,但是A的其他字段将得到验证。但是我不是100%确定该验证将用于DB方面,您可以尝试吗?

否则您可以尝试;

@RestController
public class Controller {
    @PostMapping("/etc")
    ResponseEntity<String> addA(@RequestBody A a) { //disabled validation here
        B tempB = a.getB();
        a.setB(null);
        validateA(a);
        a.setB(tempB);
        // continue logic
    }
}

其中 validateA()是;

import org.springframework.validation.annotation.Validated;
@Validated
public class Validator {
    public void validateA(@Valid A a) {
        // nothing here
    }
}

这是一个丑陋的解决方案,但是解决方案……

我认为您缺少对参数的@Vaild注释,该参数将在控制器层中进行验证。

@RestController
public class AController {
    @PostMapping("/a")
    ResponseEntity<String> addA(@Valid @RequestBody A a) {
        // persisting the a entity 
        return ResponseEntity.ok("A is valid");
    }
}

实际上,如果" @valid"注释没有前缀,则不会影响参数,@jonathan解释了它。

要在坚持之前启用验证,它就是这样的工作:

@Repository
@Validated
public MyDao {
    public void insertA(@Valid A a){
        //logic here
    }
}

@validated(org.springframework.validation.annotation.validated(是启用参数验证的关键。它对我有用。