2017-06-05 12 views
4

レスト・スプリング・ブート・アプリケーションで例外を処理したい。私は、@ControllerAdviceとResponseEntityを使って、私のエラーを表すカスタムオブジェクトを返すことができますが、私が望むのは、Exesting例外の本体に新しいフィールドを追加することです。私はちょうどこのカスタム例外を投げる私のコントローラでは、このようボディ例外のスプリング・レストに新しいフィールドを追加する

@ResponseStatus(HttpStatus.CONFLICT) 
public class CustomException extends RuntimeException { 

    private List<String> errors = new ArrayList<>(); 

    public CustomException(List<String> errors) { 
     this.errors = errors; 
    } 

    public CustomException(String message) { 
     super(message); 
    } 

    public CustomException(String message, List<String> errors) { 
     super(message); 
     this.errors = errors; 
    } 

    public List<String> getErrors() { 
     return errors; 
    } 

    public void setErrors(List<String> errors) { 
     this.errors = errors; 
    } 
} 

@GetMapping("/appointment") 
public List<Appointment> getAppointments() { 
    List<String> errors = new ArrayList<>(); 
    errors.add("Custom message"); 
    throw new CustomException("This is my message", errors); 
} 

Iを

は、私が余分な属性でのRuntimeExceptionを継承したカスタム例外、文字列のリストを作成しました郵便配達員と私の休憩のエンドポイントをテストする、それは春の起動が私のエラーフィールドをマーシャルしていないようだ、応答は:

{ 
    "timestamp": "2017-06-05T18:19:03", 
    "status": 409, 
    "error": "Conflict", 
    "exception": "com.htech.bimaristan.utils.CustomException", 
    "message": "This is my message", 
    "path": "/api/agenda/appointment" 
} 

例外から「パス」フィールドと「タイムスタンプ」フィールドを取得できますが、これら2つの属性のゲッターがない場合は、@ControllerAdviceを使用してカスタムオブジェクトを処理できます。

ありがとうございます。

答えて

3

ここでは、あまりにも自分のカスタム実装でそれを行うことができDefaultErrorAttributesで "パス" と "タイムスタンプ" の実装です:

パス:

String path = getAttribute(requestAttributes, "javax.servlet.error.request_uri"); 
if (path != null) { 
    errorAttributes.put("path", path); 
} 

タイムスタンプ:

errorAttributes.put("timestamp", new Date()); 

スプリングブート時のエラーのカスタマイズに関するドキュメントはhereです。

@Bean 
public ErrorAttributes errorAttributes() { 
    return new DefaultErrorAttributes() { 
     @Override 
     public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { 
      Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace); 
      // customize here 
      return errorAttributes; 
     } 

    }; 
} 

それとも、カスタム実装を書くことができます:

{ 
    "timestamp": 1413883870237, 
    "status": 500, 
    "error": "Internal Server Error", 
    "exception": "org.example.ServiceException", 
    "message": "somthing goes wrong", 
    "path": "/index" 
} 

"exception"属性は@ExceptionHandlerを使用してカスタマイズすることができます。

@Component 
public class CustomErrorAttributes extends DefaultErrorAttributes { 

    @Override 
    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { 
     Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace); 
     // customize here 
     return errorAttributes; 
    } 
} 

ErrorAttributes Beanは、以下のエラー応答をカスタマイズします。 A @ControlerAdviceは、コントローラ間で一般的に例外をカスタマイズするために使用できます。コントローラレベルでカスタマイズするには、コントローラ内に配置することができます。

は、あなたのケースでは:

@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Invalid Inputs") 
    @ExceptionHandler(CustomException.class) 
    private void errorHanlder() { 
     //Log exception 
    } 


    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { 
    Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace); 
    Throwable error = getError(requestAttributes); 
    if (error instanceof CustomException) { 
     errorAttributes.put("errorList", ((CustomException)error).getErrors()); 
    } 
    return errorAttributes; 
} 
+1

私は自分のコントローラにこの機能を統合しようとしたが、私はこの例外に私は私のエンドポイントへのコール行われるたびました: org.thymeleaf.exceptions.TemplateInputException:エラーテンプレートを "一般的な/エラー"を解決する、テンプレートが存在しないか、設定されたテンプレートリゾルバでアクセスできない可能性があります – Habchi

+1

私はあなたがRESTエンドポイントを実装していると思います。したがって、ResponseEntityを使用してください。 – YuVi

+1

この解決方法は、質問の投稿で私が話したことです。私はそれを使用することができますが、どのように私はカスタムエラーオブジェクトにそれらを追加することができますので、例外のボディからパスとタイムスタンプ属性を取得できますか? – Habchi

関連する問題