2017-11-22 4 views
-1

In einer Spring-Anwendung habe ich einen Endpunkt, der normalerweise ein Bild zurückgibt (produces = MediaType.IMAGE_PNG_VALUE).Ermitteln akzeptabler Inhaltstypen in ExceptionHandler

Ich habe auch @ExceptionHandler Funktionen, um verschiedene Funktionen zu behandeln.

Ich versuche, einen Weg zu finden, um zu bestimmen, aus der @ExceptionHandler, wenn der Kunde text/plain oder text/json so im Falle eines Fehlers annehmen werde ich wieder einer von denen, zurückgeben kann, oder es weglassen, wenn sie nur sind erwartet image/png.

Wie kann ich feststellen, welche zulässigen Inhaltstypen ich für eine bestimmte Anfrage zurückgeben kann?

+0

Um den Downvoter, warum teilen? Ich habe eine sehr knappe Frage gestellt. Ich könnte einen Beispielcode zur Verfügung stellen, aber es würde der Frage nichts hinzufügen, denn für meine eigentliche Frage weiß ich nicht, wo ich anfangen soll. Es ist wahrscheinlich nur eine oder zwei Zeilen, die ich brauche. – samanime

Antwort

0

Das ist die Antwort, die ich mir ausgedacht habe. Es ist ähnlich wie YoungSpice ist, aber es ist ein wenig flexibler und nutzt Media direkt (das heißt, es werden Wildcard-Typen wie text/* und dergleichen handhaben):

private ResponseEntity<String> buildResponse(WebRequest request, HttpStatus status, String message) { 
     HttpHeaders httpHeader = new HttpHeaders(); 
     List<MediaType> acceptHeader = 
       MediaType.parseMediaTypes(Arrays.asList(request.getHeaderValues(HttpHeaders.ACCEPT))); 

     if (acceptHeader.stream().anyMatch(mediaType -> mediaType.isCompatibleWith(MediaType.APPLICATION_JSON))) { 
      httpHeader.setContentType(MediaType.APPLICATION_JSON); 
      return new ResponseEntity<>("{ \"error\": \"" + message + "\" }", httpHeader, status); 
     } else if (acceptHeader.stream().anyMatch(mediaType -> mediaType.isCompatibleWith(MediaType.TEXT_PLAIN))) { 
      httpHeader.setContentType(MediaType.TEXT_PLAIN); 
      return new ResponseEntity<>(message, httpHeader, status); 
     } else { 
      return ResponseEntity.status(status).body(null); 
     } 
    } 

Im Grunde ist es MediaType.parseMediaTypes() verwendet die Accept Header zu analysieren, dann streame ich durch sie und verwende die mediaType.isCompatibleWith() Funktion, um zu überprüfen, ob mein Ziel akzeptabel ist. Dies wird es behandeln lassen, wenn die Kopfzeile etwas wie application/* anstelle von application/json direkt hat.

Es scheint auch, als ob Accept nicht explizit in der Anfrage zur Verfügung gestellt wird, gibt es eine implizierte */*, die wie vorgesehen funktioniert scheint.

1

Sie können auf die Anforderung zugreifen, Header zu prüfen und eine entsprechende Antwort zurückgeben. Es ist Standard Content Negotiation.

Hier ein Beispiel:

@ControllerAdvice 
public class MyExceptionHandler extends ResponseEntityExceptionHandler { 

    @ExceptionHandler(value = {RuntimeException.class}) 
    protected ResponseEntity<Object> handleMyException(RuntimeException ex, WebRequest request) { 
     List<String> acceptableMimeTypes = Arrays.asList(request.getHeaderValues(HttpHeaders.ACCEPT)); 
     if (acceptableMimeTypes.contains(MediaType.TEXT_PLAIN_VALUE)) { 
      return ResponseEntity.ok() 
        .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE) 
        .body("hello"); 
     } 
     throw ex; 
    } 
} 

Es gibt einige Argumente, dass spring-mvc automagically in controller Methoden injizieren kann und WebRequest (die spring Darstellung eines http Anfrage s‘ist) ist einer von diesen. Wenn der Client einen Header Accept : text/plain mit der Anforderung gesendet hat, gibt das obige Beispiel die Zeichenfolge hello zurück, wenn es eine RuntimeException gibt. Wenn es keine Ausnahme gibt, wird diese Logik überhaupt nicht ausgelöst, so dass der Endpunkt nur zurückkehrt, was normalerweise zurückgegeben wird. Sie können mehr über @ControllerAdvice und @ExceptionHandlerhere lesen.

Natürlich denken Sie über die genauen Ausnahmetypen nach, die Sie behandeln möchten, und semantisch passende Statuscodes, die zurückgegeben werden, damit die Clients die Antwort richtig interpretieren können.

Verwandte Themen