我在我的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类?
答案 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;
}
}