我对userUuid
和itemUuid
:
null
。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的约束。唯一约束应用于CartItemId
中返回的(4)
。但是,从不验证参数和返回值。既不是标准@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 Boot 2.0.0.RELEASE
。 org.hibernate.validator:hibernate-validator:6.0.7.Final
在我的课程中。
答案 0 :(得分:2)
方法参数的验证基于AOP:验证代理拦截方法调用并在委托之前验证参数(如果一切都有效),以及实际方法。
您正在从同一个类的另一个方法调用getCartItemId()
方法。因此方法调用不会通过代理。只能拦截bean间调用。
因此,简而言之,getCartItemId
应该在一个单独的bean中,注入到你的控制器中。