Spring Boot方法验证

时间:2018-03-10 15:36:17

标签: java spring spring-boot bean-validation

问题

我对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的约束。唯一约束应用于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.RELEASEorg.hibernate.validator:hibernate-validator:6.0.7.Final在我的课程中。

1 个答案:

答案 0 :(得分:2)

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

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

因此,简而言之,getCartItemId应该在一个单独的bean中,注入到你的控制器中。