如何在持久化之前启用 Spring Bean 验证但忽略 HTTP 请求
How to enable Spring Bean Validation before persisting but ignore for HTTP request
这是我的场景
class B {
@NotNull
String x;
}
class A {
@Valid
B b;
@NotNull
String y;
}
现在我的 Http POST 请求得到一个 class A
的对象作为负载。 String y
应该在传入的 HTTP 请求中进行验证(并且在持久化到数据库之前也进行验证)。但是 String x
不应在传入的 HTTP 请求中进行验证(并且仅在持久保存到数据库之前进行验证),因为 String x
在请求中将为 null 并且其值将由业务逻辑在完整 class A
对象被持久化。
有什么办法可以做到这一点吗?
我认为您缺少在将在控制器层中验证的参数上添加 @Vaild 注释。
@RestController
public class AController {
@PostMapping("/a")
ResponseEntity<String> addA(@Valid @RequestBody A a) {
// persisting the a entity
return ResponseEntity.ok("A is valid");
}
}
如果可以编辑这些对象,则可以使用验证组;
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
的验证将被忽略,但[=16的其他字段=] 将被验证。但我不是 100% 确定验证将在数据库端应用,你可以试试吗?
否则你可以试试看;
@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
}
}
这是一个丑陋的解决方案,但仍然是一个解决方案...
实际上,如果“@Valid”注释没有作为参数前缀,它不会影响,@Jonathan 解释了。
要在持久化之前启用验证,它是这样工作的:
@Repository
@Validated
public MyDao {
public void insertA(@Valid A a){
//logic here
}
}
@Validated(org.springframework.validation.annotation.Validated) 是启用参数验证的关键。对我有用。
这是我的场景
class B {
@NotNull
String x;
}
class A {
@Valid
B b;
@NotNull
String y;
}
现在我的 Http POST 请求得到一个 class A
的对象作为负载。 String y
应该在传入的 HTTP 请求中进行验证(并且在持久化到数据库之前也进行验证)。但是 String x
不应在传入的 HTTP 请求中进行验证(并且仅在持久保存到数据库之前进行验证),因为 String x
在请求中将为 null 并且其值将由业务逻辑在完整 class A
对象被持久化。
有什么办法可以做到这一点吗?
我认为您缺少在将在控制器层中验证的参数上添加 @Vaild 注释。
@RestController
public class AController {
@PostMapping("/a")
ResponseEntity<String> addA(@Valid @RequestBody A a) {
// persisting the a entity
return ResponseEntity.ok("A is valid");
}
}
如果可以编辑这些对象,则可以使用验证组;
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
的验证将被忽略,但[=16的其他字段=] 将被验证。但我不是 100% 确定验证将在数据库端应用,你可以试试吗?
否则你可以试试看;
@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
}
}
这是一个丑陋的解决方案,但仍然是一个解决方案...
实际上,如果“@Valid”注释没有作为参数前缀,它不会影响,@Jonathan 解释了。
要在持久化之前启用验证,它是这样工作的:
@Repository
@Validated
public MyDao {
public void insertA(@Valid A a){
//logic here
}
}
@Validated(org.springframework.validation.annotation.Validated) 是启用参数验证的关键。对我有用。