Spring 引导方法验证
Spring Boot method validation
问题
我对 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)
中的 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.RELEASE
。 org.hibernate.validator:hibernate-validator:6.0.7.Final
在我的类路径中。
方法参数的验证基于 AOP:验证代理拦截方法调用并在委托(如果一切都有效)到实际方法之前验证参数。
您正在从相同 class 的另一个方法调用 getCartItemId()
方法。所以方法调用不通过代理。只能拦截inter-bean个电话。
所以,简而言之,getCartItemId
应该在一个单独的 bean 中,注入到您的控制器中。
问题
我对 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)
中的 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.RELEASE
。 org.hibernate.validator:hibernate-validator:6.0.7.Final
在我的类路径中。
方法参数的验证基于 AOP:验证代理拦截方法调用并在委托(如果一切都有效)到实际方法之前验证参数。
您正在从相同 class 的另一个方法调用 getCartItemId()
方法。所以方法调用不通过代理。只能拦截inter-bean个电话。
所以,简而言之,getCartItemId
应该在一个单独的 bean 中,注入到您的控制器中。