gpt4 book ai didi

java - Spring MVC : What's the right way to register custom Validator in REST controller

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:08 24 4
gpt4 key购买 nike

我正在尝试了解 Spring 中验证的工作原理。到目前为止,我了解到有两种方法可以执行用户输入数据的验证:

  • 基于 javax.validation.constraints 注释的 JSR-303 验证。此验证最适合简单的对象字段验证。但您也可以实现自定义类型级别注释,以根据检查多个字段的值执行更复杂的验证。
  • Spring 验证基于 org.springframework.validation.Validator 接口(interface)。似乎更适合更复杂的验证。

如果我想同时使用这两种方法,在 Controller 中注册我的自定义 validator 的正确方法是什么?

这就是我想要做的。

我的自定义 validator 。

public class PasswordPairValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return PasswordPair.class.equals(clazz);
}

@Override
public void validate(Object target, Errors errors) {
PasswordPair password = (PasswordPair) target;
if (!password.getPassword().equals(password.getRepeatPassword())) {
errors.reject("passwordField", "passwords don't match");
}
}
}

我的 Controller 。

@RestController
@RequestMapping("/api/v1/users")
public class UserController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new PasswordPairValidator());
}

@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<UserInfo> createUser(
@RequestBody @Valid UserInfo userInfo) {
userInfo.setId(123);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}").buildAndExpand(userInfo.getId()).toUri();
return ResponseEntity.created(location).body(userInfo);
}

@RequestMapping(value = "/change_password", method = RequestMethod.POST)
public ResponseEntity<UserInfo> changePassword(
@RequestBody @Valid PasswordPair password) {
UserInfo user = new UserInfo("test@gmail.com", "testuser");
user.setId(123);
return ResponseEntity.ok().body(user);
}
}

当我调用 createUser 端点时,代码失败并出现以下错误:

ERROR c.e.testapp.controller.GlobalExceptionHandler - Internal Server Error
java.lang.IllegalStateException: Invalid target for Validator [com.example.testapp.validation.PasswordPairValidator@49acd001]: com.example.testapp.domain.UserInfo@cae4750

问题显然是 Spring 试图将 PasswordPairValidator 应用于 UserInfo 对象,这不是我的本意。为什么 Spring 不使用 validator 的 supports() 方法来检查哪些对象可以应用 validator ?
在另一个 stackoverflow 问题中,我发现我需要为 @InitBinder 注释指定值以使其工作,并且该值应该是“passwordPair”。但是这个值是什么,因为它不是类名(“PasswordPair”)或方法参数值(“password”)?

第二个问题是,如果我想添加多个 validator ,我是否需要定义多个 @InitBinder("value") 方法,还是有更简单的方法来实现?

最后一个问题,也许最好对所有内容都使用基于注释的验证,以验证单独的字段并使用 ConstraintValidator 实现类型级别的自定义注释以执行更复杂的验证?这些方法的优缺点有点令人困惑。

最佳答案

您必须为您的@InitBinder 注释提供一个参数。请引用这个question

上述问题也回答了您关于注册多个 validator 的其他问题。

关于java - Spring MVC : What's the right way to register custom Validator in REST controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49998093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com