绕过 PUT 请求的唯一性验证器



我面临着一个问题,即无法绕过用于在 POST 和 PUT 请求上检查对象名称唯一性的单个验证器。详情如下:

鉴于

具有两个字段的类用户DTO

private int id
@UserUniquenessValidator
private String name

控制器方法签名

post(@Valid @RequestBody UserDTO userDTO)
put(@PathVariable int id, @Valid @RequestBody UserDTO userDTO)

应用于字段名称的自定义验证程序

@UserUniquenessValidator

现在,每当我尝试发布新用户时,自定义验证器只需根据数据库中的其他记录检查名称字段,如果找不到任何记录,则返回 true,反之亦然。

每次发送字段"name"未更改的PUT请求时都会出现问题 - 验证器检查唯一性并且不会通过,因为它已经在数据库中具有给定名称的条目。

附带说明一下,我应该提到,由于太长而无法解释的原因,不能对数据库中的表应用约束。

是否有一个聪明的绕行解决方案,而不必过多地弄乱代码?我希望有一种方法可以让验证者知道,每当 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是一个很好的标题,但对于注解本身来说则不然。我会把它命名为@UniqueName.

相关内容

  • 没有找到相关文章

最新更新