Dropwizard将自定义异常反序列化为JSON?

时间:2017-04-05 12:52:27

标签: java jackson jetty dropwizard exceptionmapper

我在我的Dropwizard服务中创建了一个新的异常类,它扩展了BadRequestException。

public class CustomBadRequestException extends BadRequestException {

    private static final long serialVersionUID = 1L;

    private List<ValidationFailureDto> validationFailures;

    public CustomBadRequestException() {
        super();
    }

    public CustomBadRequestException(final List<ValidationFailureDto> validationFailures) {
        super();
        this.validationFailures = validationFailures;
    }

    @ApiModelProperty(value = "List of validationFailures")
    public List<ValidationFailureDto> getValidationFailures() {
        return validationFailures;
    }
}

当我首先抛出异常时,我只回到反序列化的BadRequestException,减去附加属性(validationFailures)

{
code: "400",
message: "Bad request"
}

这是因为Dropwizard的内部有一个默认的异常映射器,允许Jetty / Jackson理解域异常以及如何发送适当的HTTP响应。

为了解决这个问题,您可以实现自己的ExceptionMapper类并使用Dropwizard注册它。

public class CustomBadRequestExceptionMapper implements ExceptionMapper<SamplePackOrderBadRequestException> {

/**
 * Allows jackson to deserialise custom exceptions and its properties to JSON response
 *
 * @param exception exception
 * @return response object
 */
@Override
public Response toResponse(final SamplePackOrderBadRequestException exception) {

    if (exception instanceof SamplePackOrderBadRequestException) {

        SamplePackOrderBadRequestException samplePackOrderBadRequestException
                = (SamplePackOrderBadRequestException) exception;
        return Response
                .status(400)
                .entity(samplePackOrderBadRequestException)
                .build();
    }
    return Response.status(400).build();
}
}

然而,这个问题是它反序列化super(Throwable),所以你在响应中添加了我不想要的每一个继承属性。

为了解决这个问题,我尝试添加像这样的杰克逊注释:

@JsonIgnoreProperties(value = "stackTrace")

这不是最佳解决方案,因为除了stackTrace之外还有一些我需要忽略的属性。

总而言之,如何在没有我不需要的额外混乱的情况下让Dropwizard正确反序列化我的CustomException类?

1 个答案:

答案 0 :(得分:1)

我认为更容易的选择是将异常转换为Error bean并返回它,如下所示。

public class CustomBadRequestExceptionMapper implements ExceptionMapper<SamplePackOrderBadRequestException> {


@Override
public Response toResponse(final SamplePackOrderBadRequestException exception) {

    if (exception instanceof SamplePackOrderBadRequestException) {

        SamplePackOrderBadRequestException ex
            = (SamplePackOrderBadRequestException) exception;
         return Response
            .status(400)
            .entity(new ErrorBean(400,ex.getMessage,ex.getgetValidationFailures()))
            .build();
    }
    return Response.status(400).build();
}
}

和ErrorBean.java

    public static class ErrorBean{
    private int code;
    private String message;
    private List<ValidationFailureDto> failures;
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public List<ValidationFailureDto> getFailures() {
        return failures;
    }
    public void setFailures(List<ValidationFailureDto> failures) {
        this.failures = failures;
    }
}