gpt4 book ai didi

json - Wildfly:ExceptionMapper 未通过 RestEasy JSR-303 Bean 验证触发

转载 作者:行者123 更新时间:2023-12-03 13:58:24 24 4
gpt4 key购买 nike

我在 Wildfly 8.2.0.Final 中使用带有 RestEasy 的 Bean 验证:

@Path("/user")
@Produces(MediaType.APPLICATION_JSON)
public class UserEndpoint
{
//more code

@GET
@Path("/encrypt/{email}")
public Response fetchEncryptedId(@PathParam("email") @NotNull String email)
{
String encryptedUserId = userService.getEncryptedUserId(email);

return Response.ok().entity(new UserBo(encryptedUserId)).build();
}
}

这基本上有效。现在我想将响应作为 JSON 对象,但我无法让它工作。我所有的“应用程序”异常都由我的异常映射器处理,这有效:
@Provider
public class DefaultExceptionMapper implements ExceptionMapper<Exception>
{
private static final String MEDIA_TYPE = "application/json";

private LoggingService loggingService;

@EJB
public void setLoggingService(LoggingService loggingService)
{
this.loggingService = loggingService;
}

@Override
public Response toResponse(Exception exception)
{
ResponseObject responseObject = new ResponseObject();
responseObject.registerExceptionMessage(exception.getMessage());

if (exception instanceof ForbiddenException)
{
loggingService.log(LogLevel.ERROR, ((ForbiddenException)exception).getUserId(), ExceptionToStringMapper.map(exception));
return Response.status(Status.FORBIDDEN).type(MEDIA_TYPE).entity(responseObject).build();
}

//more handling

loggingService.log(LogLevel.ERROR, "", ExceptionToStringMapper.map(exception));
return Response.status(Status.INTERNAL_SERVER_ERROR).type(MEDIA_TYPE).entity(responseObject).build();
}
}

但是 bean 验证以某种方式绕过了它。然后我想用 可 throw 而不是 Exception 但它也没有帮助。我猜 ExceptionMapper 没有被触发,因为 JAX-RS 和 JSR303 存在一些生命周期问题。但是如何同步它们以处理 bean 验证异常?
附加信息:异常通过 javax.ws.rs.container.ContainerResponseFilter所以我可以通过在子类中实现 filter 方法来编写一些解决方法,但这不是干净的解决方案。目标是处理异常映射器中的异常。

最佳答案

您的 ExceptionMapper<Exception> 并非总是如此将捕获 Exception 下的所有异常等级制度。如果有另一个更具体的映射器,请为 RuntimeException 说一个,该映射器将用于 RuntimeException 的所有异常及其亚型。

话虽如此(假设您使用的是 resteasy-validation-provider-11 ),已经有一个 ResteasyViolationExceptionMapper 处理 ValidationException .

@Provider
public class ResteasyViolationExceptionMapper
implements ExceptionMapper<ValidationException>

这个映射器是自动注册的。它以 ViolationReport 的形式返回结果.客户端需要设置 Accept标题到 application/json为了看到类似的响应
{
"exception":null,
"fieldViolations":[],
"propertyViolations":[],
"classViolations":[],
"parameterViolations":[
{
"constraintType":"PARAMETER",
"path":"get.arg0",
"message":"size must be between 2 and 2147483647",
"value":"1"}
],
"returnValueViolations":[]
}

您可以在 Violation reporting 看到更多信息.

如果你想完全覆盖这个行为,你可以为 ResteasyViolationException 创建一个更具体的映射器。 ,这是 RESTeasy 验证器抛出的异常
@Provider
public class MyValidationMapper
implements ExceptionMapper<ResteasyViolationException> {

@Override
public Response toResponse(ResteasyViolationException e) {

}
}

关于json - Wildfly:ExceptionMapper 未通过 RestEasy JSR-303 Bean 验证触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com