2016-06-30 6 views
1

私はこのような例外をスローする@ResponseStatusで、スプリングを使用しています:変更形式のタイムスタンプ例外春

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Unknown task") 
public class TaskNotFoundException extends RuntimeException { 

    private static final long serialVersionUID = 1L; 

    private long taskId; 

    public TaskNotFoundException(long taskId) { 
     this.taskId = taskId; 
    } 

    public long getTaskId() { 
     return taskId; 
    } 
} 

私は応答のこの種の取得:

{ 
    "timestamp": 1467278537988, 
    "status": 404, 
    "error": "Not Found", 
    "exception": "com.TaskNotFoundException", 
    "message": "Unknown Task" 
} 

を、私はどのように知りたいですタイムスタンプ形式を変更してISO 8601形式にします。あなたの助け

答えて

0

あなたがエラーをカスタマイズすることができます応答は@ExceptionHandlerおよび@ResponseBodyである。たとえば:

@ExceptionHandler(TaskNotFoundException.class) 
@ResponseBody 
@ResponseStatus(value = HttpStatus.NOT_FOUND) 
private Message handleMessage(TaskNotFoundException e) { 
    Message message = new Message(); 
    message.setTimestamp(ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT)); 
    message.setError("Not Found"); 
    message.setStatus(404); 
    message.setException("com.TaskNotFoundException"); 
    message.setMessage("Unknown Task"); 
    return message; 
} 

Messageはエラーレスポンスボディを保持するための簡単なPOJOです。コントローラベースの例外処理のために

public class Message { 

    private long timestamp; 
    private String error; 
    private int status; 
    private String exception; 
    private String message; 

    // getters and setters 

} 

、あなたは特別な例外を処理するために、任意のコントローラに余分@ExceptionHandlerメソッドを追加することができます。

@Controller 
class ExceptionHandlingController { 

    @ExceptionHandler(TaskNotFoundException.class) 
    @ResponseBody 
    @ResponseStatus(value = HttpStatus.NOT_FOUND) 
    private Message handleMessage(TaskNotFoundException e) { 
     ... 
    } 

} 

グローバル例外処理のために、あなたは@ControllerAdviceを使用することができます。

@ControllerAdvice 
class GlobalControllerExceptionHandler { 

    @ExceptionHandler(TaskNotFoundException.class) 
    @ResponseBody 
    @ResponseStatus(value = HttpStatus.NOT_FOUND) 
    private Message handleMessage(TaskNotFoundException e) { 
     ... 
    } 

} 

詳細をチェックしてくださいhttps://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

+0

私はまだ問題があります。応答ヘッダーには、自分の '@ RequestMapping'のhttpステータス' @ResponseStatus(HttpStatus.OK) 'が含まれています。 'ResponseStatus'を' @ExceptionHandler(TaskNotFoundException.class) 'に追加すると、古いSpring JSONレスポンスが表示されます。 – ahbon

+0

'@ResponseStatus(HttpStatus.OK)'は、処理メソッドが正常に返った場合にのみ 'OK'を返すので、実際の原因は不明です。ハンドラが例外をスローした場合、アノテーションは適用されません。私は例外ハンドラで 'ResponseEntity 'を試して、 'ResponseEntity'にhttpステータスを明示的に設定できると思います。 – Wilson

+0

私はついに見つけました。私は '@ ResponseStatus'の' reason'属性を取り除かなければなりませんでした – ahbon

0

ためのおかげであなたは、このために@ExceptionHandlerを使用して、ISO 8601の日付フォーマットを使用して独自の応答を構築することができます

私は例を添付しました下:

@Controller 
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE) 
public class SomeController { 
... 
    @ExceptionHandler(TaskNotFoundException.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    public @ResponseBody 
    Map<String,Object> handleTaskNotFoundException(TaskNotFoundException tnfe, 
              HttpServletRequest request, HttpServletResponse resp) { 
    HashMap<String, Object> result = new HashMap<>(); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'"); 
    df.setTimeZone(TimeZone.getTimeZone("UTC")); 
    String formattedDate = df.format(new Date()); 
    result.put("8601date", formattedDate); 
    ... 
    return result; 
    } 
}