【问题标题】:@Size annotation doesn't seem to work for my class@Size 注释似乎不适用于我的班级
【发布时间】:2019-11-12 19:13:45
【问题描述】:

我有一个 Spring Boot 控制器,其端点接受以下配置类(作为 json)。该类具有参数maxIterations,并将@Size 注释设置为9000

...
import javax.validation.constraints.Max;
import javax.validation.constraints.Size;

public class Configuration {
    // Max iterations
    @Size(max = 9000)
    private Integer maxIterations;

    ...
}

问题在于,当使用以下json 对该端点进行POST 调用时,它不会返回错误或警告,说明maxIterations 参数高于9000

{
  "maxIterations": 15000
}

这是我的控制器:

@PostMapping()
@ResponseStatus(HttpStatus.CREATED)
public String doSomething(@RequestBody Configuration configuration) {
    ...
}

可能是什么问题?

【问题讨论】:

  • @Size 注解只是一个注解。如果您使用使用这些注释的 valdiator,则注释会产生效果;否则什么也不会发生。你在使用验证器吗?如果是这样,请显示代码。如果没有,那就是什么都没有发生的原因。
  • 即使验证有效,它也不是你想的那样。 @Size annotation 用于限制字符序列和集合的大小。对于约束数字,您应该使用@Min@Max
  • 最初是@Max,但效果不佳。
  • 您应该将@Valid@Validated 添加到您的@RequestBody 注释方法参数中。如果您不这样做,则不会触发验证。

标签: java spring-boot configuration annotations


【解决方案1】:

正如 cmets 中所述,您应该使用 @Max(9000),因为 @Size 只能用于数组、字符串、集合和映射。

public class Configuration {
    @Max(9000)
    private Integer maxIterations;

    // ...
}

此外,您应该在控制器中使用 @Valid 注释,以便 bean 验证器知道 Configuration 类中存在约束,例如:

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public String doSomething(@Valid @RequestBody Configuration configuration) {
    // ...
}

【讨论】:

  • 它仍然没有返回错误。尝试使用@Valid@Validated
  • @VaheKarapetyan 我自己实际测试过,这应该可以,我使用的代码可以在this Gist 中找到,除了我得到的请求和错误。您要发送什么请求正文?
  • @VaheKarapetyan 此外,提供您使用的依赖项列表。仅当验证 API 的正确实现位于类路径上时,才会创建验证处理器 bean。默认情况下,如果你使用 spring-boot-starter-web,你的类路径中应该有 hibernate-validator
  • 在这种情况下,我必须添加以下启动器来提供验证器配置:org.springframework.bootspring-boot-starter-validation
猜你喜欢
  • 2020-04-13
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多