Spring 引导方法验证

Spring Boot method validation

问题

我对 userUuiditemUuid 有以下限制:

我尝试在我的控制器中实现验证,例如:

@RestController
@Validated // (1)
public class CartItemController {

    @PostMapping("/me/carts/{itemUuid}")
    @ResponseStatus(HttpStatus.CREATED)
    public void addItem(@PathVariable("itemUuid") String itemUuid,
                        Authentication auth) {
        CartItemId id = getCartItemId(getUserUuidFrom(auth), itemUuid);
        ...
    }

    @Unique // (4)
    public CartItemId getCartItemId(@NotNull @Uuid String userUuid, // (2)
                                    @NotNull @Uuid String itemUuid) { // (3)
        return new CartItemId(userUuid, itemUuid);
    }
    ...
}

@Uuid@Unique 是自定义约束。 (1) 中启用了方法验证。 (2) 是用户 UUID 的约束。 (3) 是项目 UUID 的约束。唯一约束应用于 (4) 中的 returned CartItemId。但是,永远不会验证参数和 return 值。既不是标准 @NotNull 约束,也不是我的自定义约束。我收到 HTTP 状态 201 Created 而不是 400 Bad Request.

我做错了什么?

有用的东西

以下代码适用于项目 UUID:

@RestController
@Validated
public class CartItemController {

    @PostMapping("/me/{itemUuid}")
    @ResponseStatus(HttpStatus.CREATED)
    public void addItem(@PathVariable("itemUuid") @Uuid String itemUuid, // (1)
                        Authentication auth) {
        ...
    }

}

@Uuid 添加到路径变量参数有效。 anInvalidUuid 之类的值将被拒绝。我还在其他用例中测试了 @Unique 约束,它运行良好。

addItem()toId()有什么区别?

版本

我正在使用 Java 1.8 和 Spring 启动 2.0.0.RELEASEorg.hibernate.validator:hibernate-validator:6.0.7.Final 在我的类路径中。

方法参数的验证基于 AOP:验证代理拦截方法调用并在委托(如果一切都有效)到实际方法之前验证参数。

您正在从相同 class 的另一个方法调用 getCartItemId() 方法。所以方法调用不通过代理。只能拦截inter-bean个电话。

所以,简而言之,getCartItemId 应该在一个单独的 bean 中,注入到您的控制器中。