java - 绕过 PUT 请求的唯一性 validator

标签 java spring hibernate spring-mvc spring-validator

我面临着无法绕过单个 validator 的问题,该 validator 用于根据 POST 和 PUT 请求检查对象名称的唯一性。详情如下:

给定,

具有两个字段的 UserDTO 类

private int id

@UserUniquenessValidator
private String name

Controller 方法签名

post(@Valid @RequestBody UserDTO userDTO)

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

应用于字段名称的自定义 validator

 @UserUniquenessValidator

现在,每当我尝试发布新用户时,自定义 validator 都会简单地根据数据库中的其他记录检查名称字段,如果没有找到任何记录,则返回 true,反之亦然。

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

顺便说一句,我应该提到该约束不能应用于数据库中的表,原因太长,无法解释。

是否有一个巧妙的解决方案来解决这个问题,而不必使代码变得过于困惑?我希望有一种方法可以让 validator 知道,无论何时 PUT 进来都遵循与 POST 请求不同的逻辑。

最佳答案

我可以假设您的 validator 已经是一个 Spring bean:您检索数据库记录以追求名称唯一性。

假设 validator 仅涉及请求验证上下文,您可以注入(inject) HttpServletRequest 代理来为 validator 提供请求上下文

@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[] exceptFor:

@UserUniquenessValidator(excludeFor={"PUT"})

我发现注释名称不正确。对于处理此注释的类来说,UserUniquenessValidator 是一个很好的标题,但对于注释本身来说却不是。我将其命名为 @UniqueName

关于java - 绕过 PUT 请求的唯一性 validator ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52851179/

相关文章:

java - 为什么在执行多对多查询时我的 Set 变量会抛出错误?

java - 如何在执行JAR时外部向spring boot提供mysql主机

mysql - hibernate 事务导致 mysql innodb 中的提交和后续回滚

java - 在Windows 7 64位以及Java 8和Maven3.3.3上构建hadoop 3.0.0-SNAPSHOT时出现问题

java - SecureRandom 问题 : PRNG not consistent in java 1. 5

java - Spring AMQP 的 "Cannot convert value of type"异常

java - Spring-data-jpa:批量插入不起作用

java - JDBC VS Hibernate

Java 8 通过签名推断方法引用解析,这是否损坏?

java - setLocation 的 Geofire 错误