问题
我对 userUuid
和 itemUuid
有以下限制:
-
两个字符串不得为
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 回答
方法参数的验证基于AOP:验证代理拦截方法调用并在委托(如果一切有效)之前验证参数到实际方法 .
您正在从同一个类的另一个方法调用
getCartItemId()
方法 . 因此方法调用不会通过代理 . 只能拦截bean间调用 .所以,简而言之,
getCartItemId
应该在一个单独的bean中,注入你的控制器 .