2013-10-31 15 views
12

W moim module obsługi żądań chcę wykonać pewną walidację i na podstawie wyniku sprawdzenia poprawności zwrócę inną odpowiedź (sukces/błąd). Tak więc tworzę klasę abstrakcyjną dla obiektu odpowiedzi i tworzę 2 podklasy dla przypadku niepowodzenia i udanego przypadku. Kod wygląda mniej więcej tak, ale nie kompiluje się, narzekając, że errorResponse i successResponse nie mogą zostać przekonwertowane na AbstractResponse.Spring MVC: Jak zwrócić inny typ w treści ResponseEntity

Jestem całkiem nowy w Java Generic i Spring MVC, więc nie znam prostego sposobu rozwiązania tego problemu.

@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

Czy 'CreateUserSuccessResponse' rozszerza' AbstractResponse'? –

+0

Tak, zarówno CreateUserSuccessResponse i ErrorResponse rozszerza AbstractResponse. – dnang

Odpowiedz

18

Istnieją dwa problemy:

  • Twój typ zwracany musi być zmienione, aby dopasować dwa odpowiedź podklas ResponseEntity<? extends AbstractResponse>
  • podczas wystąpienia swoją ResponseEntity nie można korzystać z uproszczonego <> składnia musisz określić, której klasy odpowiedzi użyjesz new ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST);

9

Innym podejściem byłoby przy użyciu obsługi błędów

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

Takie podejście umożliwia możliwość zwrotu jakichkolwiek przedmiotów, aby klasy abstrakcyjnej SUPER przypadku sukcesu, a przypadku błędu (lub nawet przypadki) to nie jest już konieczne.

+0

+1, w wielu przypadkach "@ ExceptionHandler" jest najczystszym wyborem. Powiązany przykład, który przygotowałem, aby rozwiązać problemy, które mieli moi koledzy: https://gist.github.com/jonikarppinen/6ade2554946df21db0a6 – Jonik

Powiązane problemy