这是我的方案
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(是启用参数验证的关键。它对我有用。