Java Spring HttpStatusCodeException richtig handeln

mmtzh

Cadet 3rd Year
Registriert
Nov. 2014
Beiträge
62
Hi,

also folgende Situation. Ich habe eine Spring-Boot Anwendung, die einen Http-Post Request ausführt. Als Antwort bekomme ich entweder den HTTP-Status 200 mit einem Objekt (wenn alles gepasst hat) oder den HTTP-Status 500 mit einem Fehler-Objekt (wenn etwas schief gelaufen ist).

Folgender Code führt den HTTP-Request nun erfolgreich aus und speichert das Ergebnis in dem Attribut entity. Erhalte ich nun als Antwort einen HttpStatus, der nicht 200 ist, wird die HttpStatusCodeException geworfen.
e.getResponeBodyAsString gibt mir das JSON als String zurück, das ich im Fehlerfall bekomme.
Nun möchte ich aber das JSON im Fehlerfall nicht als String ausgeben, sondern wie im Erfolgsfall in ein DTO-Objekt schreiben. Wie mache ich das?

Code:
		try {
			final ResponseEntity<SuccessDto> entity = this.restTemplate.postForEntity(URL, request, SuccessDto.class);
		}
		catch (HttpStatusCodeException e) {
			System.out.println(e.getResponseBodyAsString());
		}
 
Dann erzeuge dir einfach ein ResponseEntity<SuccessDto> bzw. SuccessDto.

Edit: das Fehlerobjekt ist ein anderes als im Erfolgsfall?
 
Zuletzt bearbeitet:
Dann nimm doch einfach den ObjectMapper und erzeug aus dem String ein Objekt.

Code:
@Component
public class MyClass {
  private final ObjectMapper om;

  public MyClass(ObjectMapper om) {
    this.om = om;
  }

  public MyErrorDto handleError(byte[] data) throws ... {
    // readValue frisst auch einen String und diverse andere Typen
    return om.readValue(data, MyErrorDto.class);
  }

}
 
Zuletzt bearbeitet:
Ja, das Fehlerobjekt ist ein anderes als im Erfolgsfall.

Aber ich kann in meinem Catch-Block auch nur noch ein e.getResponseBodyAsString oder ein e.getResponseBodyAsByteArray ausführen... aber ich kann den ResponseBody nicht zu meinem DTO Casten.

Prinzipiell könnte ich vielleicht auch für den Fehlerfall und den Erfolgsfall nur ein Objekt verwenden.
Die beiden Objekte sind ähnlich, enthalten aber jeweils ein paar unterschiedliche Attribute.
 
Zurück
Oben