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实现。
我删除了@Requires(classes = {ConstraintViolationException.class, ExceptionHandler.class})注释并ArrayList<>用逗号分隔的字符串替换了正文中的 ,它开始正常工作。虽然我不知道去掉注解的后果。
| 归档时间: |
|
| 查看次数: |
3829 次 |
| 最近记录: |