有没有一种方法可以自定义验证Spring中进入端点的两个请求参数?我希望能够用我的自定义函数来验证它们。比如在请求参数或这些参数所在的函数上添加注释,并强制其他自定义编写的函数验证这些参数
我需要同时获取两个参数,因为其中一个的验证输出取决于另一个的值
我搜索并找到了一些带有自定义约束注释的解决方案,但从我所读到的内容来看,它似乎并不能解决我的问题。
如前所述,使用valiktor是最好的选择。我在我们的产品中也用过它,它很有魅力。
下面是一个片段示例,说明如何使用它来比较同一类的两个属性。
fun isValid(myObj: Myobj): Boolean {
validate(myObj) {
validate(MyObj::prop1).isGreaterThanOrEqualTo(myobj.prop2)
}
如果验证失败,则Valiktor将抛出异常并返回正确的消息。如果你想的话,它还可以让你创建自定义的异常消息
现在,您所需要做的就是为您的requestBody创建一个类,并显式地使用isValid((方法检查您的条件,或者将其移动到init块中并隐式执行。
与JSR380相比,Valiktor有大量的验证,在JSR380中,与Valiktor相比,创建自定义验证有点混乱。
如果您要使用请求参数来创建POJO,那么您可以简单地使用Javax Validation API
。
public class User {
private static final long serialVersionUID = 1167460040423268808L;
@NotBlank(message = "ID cannot be to empty/null")
private int id;
@NotBlank(message = "Group ID cannot be to empty/null")
private String role;
@NotBlank(message = "Email cannot be to empty/null")
private String email;
@NotNull(message = "Password cannot be to null")
private String password;
}
验证-
@PostMapping("/new")
public String save(@ModelAttribute @Validated User user, BindingResult bindingResult, ModelMap modelMap) throws UnknownHostException {
if (!bindingResult.hasErrors()) {
// Proceed with business logic
} else {
Set<ConstraintViolation<User>> violations = validator.validate(user);
List<String> messages = new ArrayList<>();
if (!violations.isEmpty()) {
violations.stream().forEach(staffConstraintViolation -> messages.add(staffConstraintViolation.getMessageTemplate()));
modelMap.addAttribute("errors", messages);
Collections.sort(messages);
}
return "new~user";
}
}
您可以使用validator编写自定义验证器检查:https://docs.spring.io/spring-framework/docs/3.0.0.RC3/reference/html/ch05s02.html示例:https://www.baeldung.com/spring-data-rest-validators
valiktor是一个非常好的验证库。
你可以做一些事情,比如:
data class ValidatorClass(val field1: Int, val field2: Int) {
init {
validate(this) {
validate(ValidatorClass::field1).isPositive()
validate(ValidatorClass::field2).isGreaterThan(field1)
}
}
}
不需要make请求参数:
@RequestMapping(path = ["/path"])
fun fooEndPoint(@RequestParam("field1", required = false) field1: Int,
@RequestParam("field2", required = false) field2: Int) {
ValidatorClass(field1, field2) //it will throw an exception if validation fail
}
您可以使用try-catch
或使用validtor定义的和ExceptionHandler
来处理异常。
使用validtor可以根据其他字段验证字段。您可以创建一个kotlin文件,在其中编写用于验证请求字段的所有类,并以相同的方式在@RequestBody
模型中使用validtor来验证它。