【问题标题】:Custom annotation isn't validating method parameter自定义注释不验证方法参数
【发布时间】:2019-07-26 12:44:53
【问题描述】:

我创建了一个自定义注释

@Documented
@Constraint(validatedBy = CheckGranularityValidator.class)
@Target( { ElementType.PARAMETER} )
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckGranularity {
    String message() default "Duration has to be a multiple of granularity";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

使用这样的验证器

public class CheckGranularityValidator implements ConstraintValidator<CheckGranularity, AssetCostsRequest> {

    @Override
    public void initialize(final CheckGranularity constraintAnnotation) {

    }

    @Override
    public boolean isValid(final AssetCostsRequest value, final ConstraintValidatorContext context) {
        return value.getRange().getDuration() % value.getGranularity() == 0;
    }
}

我尝试在我的 RestController 中使用它

@RestController
public class CalcApiController extends CalcApi {

@Override
public ResponseEntity<String> calcProfitability(@Valid @CheckGranularity @RequestBody final AssetCostsRequest assetCostsRequest) {
    return ResponseEntity.ok("Works");
}

我尝试通过编写测试来使用这个注解:

@Test
public void calcTest() {
    final AssetCostsRequest request = new AssetCostsRequest()
        .setRange(new TimeRange(100L, 200L))
        .setGranularity(26L);

    given()
        .contentType(ContentType.JSON)
        .body(request)
    .when()
        .post("/calc")
    .then()
        .statusCode(HttpStatus.SC_BAD_REQUEST);
}

AssetCostsRequest 的相关部分:

public class AssetCostsRequest {

    @JsonProperty
    @NotNull
    private TimeRange range;

    @JsonProperty
    @NotNull
    private Long granularity = 30L;

    ...getters & setters
}

测试方法返回 200。当我尝试在 isValid 方法中设置断点时,运行测试时它没有被命中。我尝试更改注释顺序,摆脱@Valid,在CheckGranularity 类中更改@Target,没有任何帮助。我正在使用 RestAssured 进行测试。

我是如何做到的,所以我的注释正确地验证了一个参数?

【问题讨论】:

    标签: java spring-boot validation annotations


    【解决方案1】:

    CheckGranularity 的目标更改为ElementType.TYPE 并在AssetCostsRequest 上直接添加@CheckGranularity。还要从端点定义中删除@CheckGranularity

    它是如何工作的。通过在端点参数上添加@Valid,您可以告诉spring 来验证它。添加像@CheckGranularity 这样的验证不会在与Valid 相同的级别上工作。它必须添加到参数类中的某处。

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多