2016-06-30 14 views
1

Ich bin mit Feder mit @ResponseStatus eine Ausnahme so werfen:Format ändern Zeitstempel Ausnahme Frühling

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

ich diese Art erhalten von Antwort:

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

Ich würde gerne wissen, wie um das Zeitstempelformat zu ändern, um ISO 8601-Format zu haben. Danke für Ihre Hilfe

Antwort

0

Sie können, den Fehler Antwort mit @ExceptionHandler und @ResponseBody. Zum Beispiel:

@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 ist einfach POJO die Fehlerreaktion Körper zu halten.

public class Message { 

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

    // getters and setters 

} 

Für Controller basierte Ausnahmebehandlung, können Sie zu jedem Controller zusätzliche @ExceptionHandler Methoden in den speziellen Ausnahmen behandeln:

@Controller 
class ExceptionHandlingController { 

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

} 

Für globale Ausnahmebehandlung können Sie @ControllerAdvice verwenden:

@ControllerAdvice 
class GlobalControllerExceptionHandler { 

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

} 

Mehr Details bitte überprüfen https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

+0

Ich habe immer noch ein Problem. Der Response-Header enthält den http-Status '@ResponseStatus (HttpStatus.OK)' meines '@ RequestMapping'. Wenn ich "ResponseStatus" zu "@ExceptionHandler (TaskNotFoundException.class)" hinzufüge, wird die alte Spring JSON-Antwort angezeigt. – ahbon

+0

Ich bin mir nicht sicher, dass Ihre eigentliche Ursache ist, da '@ResponseStatus (HttpStatus.OK)' nur dann 'OK' zurückgibt, wenn die Bearbeitungsmethode normal zurückkehrt. Wenn der Handler eine Ausnahme auslöst, trifft die Annotation nicht zu. Ich denke, Sie können 'ResponseEntity ' in Ihrem Ausnahmebehandler versuchen und explizit den HTTP-Status in 'ResponseEntity' setzen. – Wilson

+0

Ich habe es endlich herausgefunden. Ich musste das "Grund" -Attribut in meinem '@ ResponseStatus' – ahbon

0

Sie @ExceptionHandler dafür verwenden können und Ihre eigene Antwort mit ISO 8601 Datumsformat bauen:

Im Folgenden werde ich ein Beispiel angebracht haben:

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