2013-10-31 3 views
12

In meinem Request-Handler möchte ich eine Validierung durchführen und basierend auf dem Ergebnis der Validierungsprüfung werde ich verschiedene Antworten zurückgeben (Erfolg/Fehler). Also erstelle ich eine abstrakte Klasse für das Antwortobjekt und mache 2 Unterklassen für den Fehlerfall und den erfolgreichen Fall. Der Code sieht ungefähr so ​​aus, aber er kompiliert nicht und beschwert sich, dass errorResponse und successResponse nicht in AbstractResponse konvertiert werden können.Spring MVC: Wie man verschiedene Typen zurückliefert ResponseEntity body

Ich bin ziemlich neu zu Java Generic und Spring MVC, so dass ich keine einfache Möglichkeit kenne, dies zu lösen.

@ResponseBody ResponseEntity<AbstractResponse> createUser(@RequestBody String requestBody) { 
    if(!valid(requestBody) { 
     ErrorResponse errResponse = new ErrorResponse(); 
     //populate with error information 
     return new ResponseEntity<> (errResponse, HTTPStatus.BAD_REQUEST); 
    } 
    createUser(); 
    CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse(); 
    // populate with more info 
    return new ResponseEntity<> (successResponse, HTTPSatus.OK); 
} 
+0

Erweitert 'CreateUserSuccessResponse'' AbstractResponse'? –

+0

Ja, sowohl CreateUserSuccessResponse und ErrorResponse erweitert AbstractResponse. – dnang

Antwort

18

Es gibt zwei Probleme:

  • Ihre Rückgabetyp geändert werden muss die beiden Antwort ResponseEntity<? extends AbstractResponse>
  • Unterklassen anpassen, wenn Sie Ihre ResponseEntity instanziiert können Sie die vereinfachte < verwenden> Syntax Sie müssen angeben, welche Antwortklasse Sie verwenden möchten new ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST);

    @ResponseBody ResponseEntity<? extends AbstractResponse> createUser(@RequestBody String requestBody) { 
        if(!valid(requestBody) { 
         ErrorResponse errResponse = new ErrorResponse(); 
         //populate with error information 
         return new ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST); 
        } 
        createUser(); 
        CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse(); 
        // populate with more info 
        return new ResponseEntity<CreateUserSuccessResponse> (successResponse, HTTPSatus.OK); 
    } 
    
9

würde Ein weiterer Ansatz Fehlerbehandlungsroutinen

@ResponseBody ResponseEntity<CreateUserSuccessResponse> createUser(@RequestBody String requestBody) throws UserCreationException { 
    if(!valid(requestBody) { 
     throw new UserCreationException(/* ... */) 
    } 
    createUser(); 
    CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse(); 
    // populate with more info 
    return new ResponseEntity<CreateUserSuccessResponse> (successResponse, HTTPSatus.OK); 
} 

public static class UserCreationException extends Exception { 
    // define error information here 
} 

@ExceptionHandler(UserCreationException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ResponseBody 
public ErrorResponse handle(UserCreationException e) { 
    ErrorResponse errResponse = new ErrorResponse(); 
    //populate with error information from the exception 
    return errResponse; 
} 

verwendet Dieser Ansatz ermöglicht es die Möglichkeit, jede Art von Objekt zurückzugeben, so eine abstrakte Superklasse für den Erfolgsfall und Fehlerfall (oder Fälle sogar) ist nicht mehr erforderlich.

+0

+1, für viele Fälle ist '@ ExceptionHandler' die sauberste Wahl. Ein verwandtes Beispiel, das ich zusammengestellt habe, um Probleme zu adressieren, die meine Kollegen hatten: https://gist.github.com/jonikarppinen/6ade2554946df21db0a6 – Jonik

Verwandte Themen