java - 自定义注释不验证方法参数

标签 java spring-boot validation annotations

我创建了一个自定义注释

@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 {};
}

使用这样的 validator

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 进行测试。

如何做到这一点,以便我的注释能够正确验证参数?

最佳答案

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

它是如何工作的。通过在端点的参数上添加@Valid,您可以告诉spring对其进行验证。添加像 @CheckGranularity 这样的验证将无法在与 Valid 相同的级别上工作。必须将其添加到参数类内的某个位置。

关于java - 自定义注释不验证方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57220367/

相关文章:

jquery - MVC 3 客户端对带有数据注释的集合进行验证 - 不起作用

java - Spring注释@Validated在kotlin类中不起作用,相同的java代码可以工作

java - 调整 BufferedImages 的大小并将其存储到 JPG 图像黑色背景的文件结果中

Java AccessControlException 仅适用于 LiveConnect

java - 按多个数字对 Java String 数组进行排序

json - 无法反序列化模型实例。*来自START_ARRAY token \n,位于

java - 配置文件上的 @ConditionalOnProperty 未加载 bean

java - 使用 ActionListener 交换网格中的两个图标

java - 无法在 Intellij 中指定主 list 属性

c++ - 给定两个值时,输入循环循环两次