首页 文章

Spring Boot方法验证

提问于
浏览
0

问题

我对 userUuiditemUuid 有以下限制:

  • 两个字符串不得为 null .

  • 两个字符串都必须是UUID(例如 f1aecbba-d454-40fd-83d6-a547ff6ff09e ) .

  • 构图 (userUuid, itemUuid) 必须是唯一的 .

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

@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) 中返回的 CartItemId . 但是,从不验证参数和返回值 . 既不是标准 @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 添加到path变量参数有效 . 像 anInvalidUuid 这样的值被拒绝了 . 我还在其他用例中测试了 @Unique 约束,它运行得很好 .

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

版本

我正在使用Java 1.8 和Spring Boot 2.0.0.RELEASE . org.hibernate.validator:hibernate-validator:6.0.7.Final 在我的类路径上 .

1 回答

  • 2

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

    您正在从同一个类的另一个方法调用 getCartItemId() 方法 . 因此方法调用不会通过代理 . 只能拦截bean间调用 .

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

相关问题