2017-04-05 3 views
1

BadRequestExceptionを拡張する新しい例外クラスをDropwizardサービスで作成しました。私が最初に私が唯一の直列化復元BadRequestExceptionを取り戻す、マイナスの追加プロパティ(validationFailures)されたJSONとしてカスタム例外をデシリアライズするDropwizard?

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

でその例外をスローする場合Dropwizardの内部は、桟橋を許可するデフォルトの例外マッパーを持っているので、これは

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; 
    } 
} 

/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(); 
} 
} 

しかし、これでこの問題は、それがスーパー(のThrowable)をデシリアライズということですので、あなたは、私はしたくない応答に追加されるすべての単一継承されたプロパティを取得します。私はそうのようなジャクソンの注釈を追加してみました。この対抗するための

@JsonIgnoreProperties(value = "stackTrace") 

を私は無視する必要がありますスタックトレース以外のいくつかのプロパティがあり、これは、最適なソリューションではありません。

要約すると、私は、Dropwizardに、私が必要としていない追加の混乱を招くことなく、CustomExceptionクラスを適切に非直列化する方法を教えてください。

+0

あなたはこれを使用することができます:http://stackoverflow.com/questions/26945580/jackson-serialization-how-to-ignore-superclass-propertiesあなたはよあなたがそれをどのように使用するかについては注意が必要です。 DWによって提供されるObjectmapperは共有されているので、他のオブジェクトがこの問題を抱えていないことを確認してください:) – pandaadb

+0

Dropwizardは実際には以下の答えで推奨されるアプローチを使用しています。彼らは[カスタムErrorMessage Java Bean](https://github.com/dropwizard/dropwizard/blob/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/errors/ErrorMessage.java)を使用して'@JsonInclude(JsonInclude.Include.NON_NULL)'アノテーション:)。これはExceptionLoggingMapper(https://github.com/dropwizard/dropwizard/blob/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/errors/LoggingExceptionMapper.java)の見方です。 – zloster

答えて

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; 
    } 
} 
+0

これは、これがDropwizardがそれ自体をやっている方法であると言えるでしょう。質問の下で私のコメントを参照してください:http://stackoverflow.com/questions/43231802/dropwizard-deserialising-custom-exception-as-json#comment73584583_43231802 – zloster

関連する問題