ConstraintViolationException 处理程序未在 Micronaut 中执行

Sha*_*057 6 java hibernate-validator bean-validation micronaut

我有一个ConstraintViolationException如下所示的处理程序类:

@Produces
@Singleton
@Requires(classes = {ConstraintViolationException.class, ExceptionHandler.class})
public class ConstraintsViolationsExceptionHandler
        implements ExceptionHandler<ConstraintViolationException, HttpResponse> {

    @Override
    public HttpResponse
    handle(HttpRequest request, ConstraintViolationException exception) {
        return HttpResponse
                .status(HttpStatus.FORBIDDEN)
                .contentType(MediaType.APPLICATION_JSON)
                .characterEncoding("UTF-8")
                .body(new SignUpPhoneNumberErrorResponse<>(400,
                        "Wrong data used",
                        new ArrayList<>(exception.getConstraintViolations())));
    }
}  
Run Code Online (Sandbox Code Playgroud)

我的错误处理 POJO 在哪里SignUpPhoneNumberErrorResponse,它被序列化为 JSON 绝对没问题。

我的控制器看起来像这样:

@Controller(PhoneAuthAndLoginConstants.CONTROLLER_BASE_PATH)
@Validated
public class UserPhoneNumberRegistrationAndLoginController {

    @Inject
    MongoDbUserSignUpPhoneNumberDAO mongoDbUserSignUpPhoneNumberDAO;

    @Post(uri = PhoneAuthAndLoginConstants.CONTROLLER_SIGN_UP_PATH,
            consumes = MediaType.APPLICATION_JSON,
            produces = MediaType.APPLICATION_JSON)
    public Single<ResponseDataEncapsulate>
    signUpForPhoneVerification(@Valid @Body UserSignUpPhoneNumberEntity phoneNumber) {
        return mongoDbUserSignUpPhoneNumberDAO.sendVerification(phoneNumber);
    }

    @Post(uri = PhoneAuthAndLoginConstants.CONTROLLER_SIGN_UP_PATH
            +
            PhoneAuthAndLoginConstants.CONTROLLER_SIGN_UP_VERIFICATION_CODE_PARAM,
            consumes = MediaType.APPLICATION_JSON,
            produces = MediaType.APPLICATION_JSON)
    public Single<ResponseDataEncapsulate>
    sendUserSignUpConfirmation(@Valid @Body UserAccountStateSignUpEntity verificationData,
                               HttpHeaders httpHeaders) {
        return mongoDbUserSignUpPhoneNumberDAO.signUp(verificationData);
    }
}  
Run Code Online (Sandbox Code Playgroud)

我的 POJOUserAccountStateSignUpEntity看起来像这样:

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserAccountStateSignUpEntity implements UserSignUpEntity {
    @NotNull @NotBlank @Size(min = 5, max = 13) private String phoneNumber;
    @NotNull @NotBlank @Size(min = 7, max = 7) private String verificationCode;
    @JsonIgnore private Boolean verifiedAccount = Boolean.FALSE;

    public UserAccountStateSignUpEntity(String phoneNumber, String verificationCode) {
        this.phoneNumber = phoneNumber;
        this.verificationCode = verificationCode;
        this.verifiedAccount = Boolean.TRUE;
    }

    @Override
    public Map<String, Object> makePhoneEntityMapForMongo() {
        HashMap<String, Object> returnMap = new HashMap<String, Object>() {{
            put("phoneNumber", phoneNumber);
            put("verificationCode", verificationCode);
            put("verifiedAccount", verifiedAccount);
        }};

        return Collections.unmodifiableMap(returnMap);
    }
}  
Run Code Online (Sandbox Code Playgroud)

我发送这样的请求负载:

{
    "phoneNumber" : "91-123456789",
    "verificationCode" : "18887"
}  
Run Code Online (Sandbox Code Playgroud)

这应该触发 aConstraintViolationException并且我的处理程序代码应该执行并且我应该得到 HTTP Forbidden。但我却收到默认的 HTTP 错误请求错误消息。

为什么我的处理程序没有被执行? 可以做什么来让它执行?

我使用Micronaut 1.1.3作为 Web 框架,并使用Hibernate Validator作为javax.validation实现。

Sha*_*057 0

我删除了@Requires(classes = {ConstraintViolationException.class, ExceptionHandler.class})注释并ArrayList<>用逗号分隔的字符串替换了正文中的 ,它开始正常工作。虽然我不知道去掉注解的后果。