web-dev-qa-db-de.com

Wie Fehlermeldung im Frühjahr mvc @Controller zurückgeben

Ich verwende Methoden wie diese 

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<UserWithPhoto> getUser(@RequestHeader(value="Access-key") String accessKey,
                                     @RequestHeader(value="Secret-key") String secretKey){
    try{
        return new ResponseEntity<UserWithPhoto>((UserWithPhoto)this.userService.chkCredentials(accessKey, secretKey, timestamp),
                new HttpHeaders(),
                HttpStatus.CREATED);
    }
    catch(ChekingCredentialsFailedException e){
        e.printStackTrace();
        return new ResponseEntity<UserWithPhoto>(null,new HttpHeaders(),HttpStatus.FORBIDDEN);
    }
}

Ich möchte eine Textnachricht zurückgeben, wenn eine Ausnahme auftritt, aber jetzt nur Status und Nullobjekt zurückgeben. Ist es möglich zu tun?

29
user3378876

Wie bereits in den Kommentaren auf Sotirios Delimanolis hingewiesen wurde, gibt es zwei Möglichkeiten:

ResponseEntity mit Fehlermeldung zurückgeben

Ändern Sie Ihre Methode wie folgt:

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity getUser(@RequestHeader(value="Access-key") String accessKey,
                              @RequestHeader(value="Secret-key") String secretKey) {
    try {
        // see note 1
        return ResponseEntity
            .status(HttpStatus.CREATED)                 
            .body(this.userService.chkCredentials(accessKey, secretKey, timestamp));
    }
    catch(ChekingCredentialsFailedException e) {
        e.printStackTrace(); // see note 2
        return ResponseEntity
            .status(HttpStatus.FORBIDDEN)
            .body("Error Message");
    }
}

Note 1: Sie müssen nicht den Builder für ResponseEntity verwenden, aber ich finde, es hilft, den Code lesbar zu halten. Es hilft auch, sich zu erinnern, welche Daten eine Antwort auf einen bestimmten HTTP-Statuscode enthalten sollte. Beispielsweise sollte eine Antwort mit dem Statuscode 201 eine Verknüpfung zu der neu erstellten Ressource im Location-Header enthalten (siehe Statuscode-Definitionen ). Aus diesem Grund bietet Spring die komfortable Build-Methode ResponseEntity.created(URI)

Note 2: Verwenden Sie nicht printStackTrace(), sondern einen Logger.

Geben Sie einen @ExceptionHandler an.

Entfernen Sie den try-catch-Block aus Ihrer Methode und lassen Sie die Ausnahme auslösen. Dann erstellen Sie eine andere Methode in einer Klasse, die mit @ControllerAdvice versehen ist, wie folgt:

@ControllerAdvice
public class ExceptionHandlerAdvice {

    @ExceptionHandler(ChekingCredentialsFailedException.class)
    public ResponseEntity handleException(ChekingCredentialsFailedException e) {
        // log exception
        return ResponseEntity
                .status(HttpStatus.FORBIDDEN)
                .body("Error Message");
    }        
}

Beachten Sie, dass Methoden, die mit @ExceptionHandler kommentiert werden, sehr flexible Signaturen haben dürfen. Weitere Informationen finden Sie im Javadoc .

71
hzpz

Hier ist eine Alternative. Erstellen Sie eine generische Ausnahme, die einen Statuscode und eine Nachricht akzeptiert. Erstellen Sie dann einen Ausnahmehandler. Verwenden Sie den Ausnahmebehandler, um die Informationen aus der Ausnahme abzurufen und an den Anrufer des Diensts zurückzukehren.

http://javaninja.net/2016/06/throwing-exceptions-messages-spring-mvc-controller/

public class ResourceException extends RuntimeException {

    private HttpStatus httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;

    public HttpStatus getHttpStatus() {
        return httpStatus;
    }

    /**
     * Constructs a new runtime exception with the specified detail message.
     * The cause is not initialized, and may subsequently be initialized by a
     * call to {@link #initCause}.
     * @param message the detail message. The detail message is saved for later retrieval by the {@link #getMessage()}
     *                method.
     */
    public ResourceException(HttpStatus httpStatus, String message) {
        super(message);
        this.httpStatus = httpStatus;
    }
}

Verwenden Sie dann einen Ausnahmebehandler, um die Informationen abzurufen und an den Anrufer des Diensts zurückzugeben.

@ControllerAdvice
public class ExceptionHandlerAdvice { 

    @ExceptionHandler(ResourceException.class)
    public ResponseEntity handleException(ResourceException e) {
        // log exception 
        return ResponseEntity.status(e.getHttpStatus()).body(e.getMessage());
    }         
} 

Erstellen Sie dann eine Ausnahme, wenn Sie müssen.

throw new ResourceException(HttpStatus.NOT_FOUND, "We were unable to find the specified resource.");
9
Norris
return new ResponseEntity<>(GenericResponseBean.newGenericError("Error during the calling the service", -1L), HttpStatus.EXPECTATION_FAILED);
0
Sudabe-Neirizi