绕过 PUT 请求的唯一性验证器
Bypassing uniqueness validator for PUT request
我遇到了一个问题,无法绕过用于根据 POST 和 PUT 请求检查对象名称唯一性的单个验证器。详情如下:
给定,
具有两个字段的 class UserDTO
private int id
@UserUniquenessValidator
private String name
控制器方法签名
post(@Valid @RequestBody UserDTO userDTO)
put(@PathVariable int id, @Valid @RequestBody UserDTO userDTO)
应用于字段名称的自定义验证器
@UserUniquenessValidator
现在,每当我尝试 POST 一个新用户时,自定义验证器只需根据数据库中的其他记录检查名称字段,如果没有找到任何记录,则 returns 为真,反之亦然反之亦然。
每次发送字段 'name' 未更改的 PUT 请求时都会出现问题 - 验证程序检查唯一性并且不会通过,因为它已经有一个具有给定名称的条目在数据库中。
附带说明一下,我应该提到由于太长无法解释的原因,无法将约束应用于数据库中的 table。
是否有一个巧妙的绕过解决方案,而不必使代码过于混乱?我希望有一种方法可以让验证器知道任何时候 PUT 进入时遵循与 POST 请求不同的逻辑。
我可以假设您的验证器已经是一个 Spring bean:您检索数据库记录以追求名称的唯一性。
假设验证器只参与请求验证上下文,可以注入一个HttpServletRequest
代理给验证器一个请求上下文
@Autowired
private HttpServletRequest request;
从中可以找出当前的 HTTP 方法。
@Override
public boolean isValid(String name, ConstraintValidatorContext context) {
return HttpMethod.PUT.name().equals(request.getMethod()) ||
validate(name, context);
}
private boolean validate(String name, ConstraintValidatorContext context) {
// validate name uniqueness
return false;
}
为了避免硬编码HttpMethod.PUT.name()
,注解可以定义String[] excludeFor
:
@UserUniquenessValidator(excludeFor={"PUT"})
我发现注释名称不正确。 UserUniquenessValidator
是处理此注释但不处理注释本身的 class 的好标题。我会把它命名为 @UniqueName
.
我遇到了一个问题,无法绕过用于根据 POST 和 PUT 请求检查对象名称唯一性的单个验证器。详情如下:
给定,
具有两个字段的 class UserDTO
private int id
@UserUniquenessValidator
private String name
控制器方法签名
post(@Valid @RequestBody UserDTO userDTO)
put(@PathVariable int id, @Valid @RequestBody UserDTO userDTO)
应用于字段名称的自定义验证器
@UserUniquenessValidator
现在,每当我尝试 POST 一个新用户时,自定义验证器只需根据数据库中的其他记录检查名称字段,如果没有找到任何记录,则 returns 为真,反之亦然反之亦然。
每次发送字段 'name' 未更改的 PUT 请求时都会出现问题 - 验证程序检查唯一性并且不会通过,因为它已经有一个具有给定名称的条目在数据库中。
附带说明一下,我应该提到由于太长无法解释的原因,无法将约束应用于数据库中的 table。
是否有一个巧妙的绕过解决方案,而不必使代码过于混乱?我希望有一种方法可以让验证器知道任何时候 PUT 进入时遵循与 POST 请求不同的逻辑。
我可以假设您的验证器已经是一个 Spring bean:您检索数据库记录以追求名称的唯一性。
假设验证器只参与请求验证上下文,可以注入一个HttpServletRequest
代理给验证器一个请求上下文
@Autowired
private HttpServletRequest request;
从中可以找出当前的 HTTP 方法。
@Override
public boolean isValid(String name, ConstraintValidatorContext context) {
return HttpMethod.PUT.name().equals(request.getMethod()) ||
validate(name, context);
}
private boolean validate(String name, ConstraintValidatorContext context) {
// validate name uniqueness
return false;
}
为了避免硬编码HttpMethod.PUT.name()
,注解可以定义String[] excludeFor
:
@UserUniquenessValidator(excludeFor={"PUT"})
我发现注释名称不正确。 UserUniquenessValidator
是处理此注释但不处理注释本身的 class 的好标题。我会把它命名为 @UniqueName
.