gpt4 book ai didi

java - 如何在 validator 中为 spring Controller 中的特定方法应用不同的行为

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:32 26 4
gpt4 key购买 nike

如果有可能为不同的 Controller 方法自定义 validator ,我想得到这种验证方法的答案。

简单 validator

@Component
public class UserDtoValidator implements Validator {
@Autowired
UserService userService;

@Override
public boolean supports(Class<?> aClass) {
return UserDto.class.isAssignableFrom(aClass);
}

@Override
public void validate(Object target, Errors errors) {
UserDto userDto = (UserDto) target;

}
//how to make 'if' below to be applied only for certain method in controller
//in this case for controller createUser method
if (userService.findByUserName(userDto.getUserName())!=null) {
throw new InvalidPayloadException("Creating user requires unique userName");
}
//second 'if' for controller updateUser method
if (userService.findByUserName(userDto.getUserName())==null) {
throw new InvalidPayloadException("Updating unexisting users is not allowed");
}
}
}

Controller :

对于 validator ,我们有两种相反的情况:

1 创建具有唯一用户名的用户

2 更新用户 - 需要的用户名

@Controller
@RequestMapping(value = "/api/users")
public class ApiUserController extends ExceptionsResolver {

@Autowired
private UserService userService;
@Autowired
private UserDtoValidator userDtoValidator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(userDtoValidator);
}


@RequestMapping(consumes = "application/json", produces = "application/json", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity createUser(@Valid @RequestBody UserDto userDto) throws JsonProcessingException {
userService.saveUser(userDto);
return new ResponseEntity(userDto, HttpStatus.ACCEPTED);
}

@RequestMapping(value = "/{userName}", consumes = "application/json", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<UserDto> updateUser(@Valid @RequestBody UserDto userDto, @PathVariable String userName) {
return new ResponseEntity("User updated", HttpStatus.ACCEPTED);
}

}

顺便说一句,我知道 PUT 应该创建新的,但在这里我只需要 PUT 来进行更新。

最佳答案

您真正关心的是用户名是否存在。在某些情况下你想要它,在某些情况下你不需要。

理论上,您可以使用带有 exists 属性的 @Username 注释。类似于阿迪的isUpdate,但是不要叫它isUpdate。您不关心需要验证的操作,您只关心用户名是否存在。

验证组是为这个问题设计的,即在不同情况下以不同方式验证 bean。创建两个验证组 NewUserExistingUser。将 @Controller 中的 @Valid 调用替换为 Spring 的 @Validated

public ResponseEntity createUser(@Validated(NewUser.class) @RequestBody UserDto userDto) throws JsonProcessingException {}

public ResponseEntity<UserDto> updateUser(@Validated(ExistingUser.class) @RequestBody UserDto userDto, @PathVariable String userName) {}

UserDto 类中,理论上您会将 username 属性标记为

@Username(exists = true, groups = ExistingUser.class);
@Username(exists = false, groups = NewUser.class);
public String getUsername() {}

但是 Java 不会让你那样做。因此,您需要一种解决方法来设置多个用户名约束。这在 Bean Validation API 中无处不在,例如在 NotNull

/**
* Defines several <code>@NotNull</code> annotations on the same element
* @see javax.validation.constraints.NotNull
*
* @author Emmanuel Bernard
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@interface List {
NotNull[] value();
}

有了这些东西,你只需要一个 UsernameValidator 可以根据 exists 标志检查用户名是否存在,验证组会负责其余的。

关于java - 如何在 validator 中为 spring Controller 中的特定方法应用不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19611658/

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