[JAVA] Verzweigungsverarbeitung mit dem Rückgabewert von RestTemplate und dem Statuscode von ResponseEntity in Spring Boot

Die Methode zum Abrufen des Statuscodes ändert sich, ohne "DefaultResponseErrorHandler" festzulegen Die Antwort war hier, aber ich habe sie verpasst.

Umgebung

Java : 11 JUnit : 4.12 Spring Boot : 2.1.6

Allgemeiner Beispielcode, unabhängig davon, ob er festgelegt ist oder nicht

SandboxApplication.java


@SpringBootApplication
public class SandboxApplication {

    public static void main(String[] args) {
        SpringApplication.run(SandboxApplication.class, args);
    }

    //Grobbohnenregistrierung hier
    @Bean
    public RestTemplate setRestTemplate(){
        return new RestTemplate();
    }
}

Hoge.java


class Hoge {
    String message;

    public Hoge(@JsonProperty("message") String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

SampleTest.java


@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {

    @Autowired
    RestTemplate restTemplate;
    @Autowired
    ObjectMapper objectMapper;
    @Autowired
    Sample sut;

    @Test
öffentlicher Leertest() throws Exception {
        //2xx Serie: ex) OK
        setUpMockRestServer(HttpStatus.OK);
        assertThat(sut.getHoge().getMessage(), is("Es ist 200"));

        //4xx Serienfehler: ex) NOT_FOUND
        setUpMockRestServer(HttpStatus.NOT_FOUND);
        assertThat(sut.getHoge().getMessage(), is("Es ist 404"));

        //5xx Serienfehler: ex) INTERNAL_SERVER_ERROR
        setUpMockRestServer(HttpStatus.INTERNAL_SERVER_ERROR);
        assertThat(sut.getHoge().getMessage(), is("Es ist 500"));
    }

    private void setUpMockRestServer(HttpStatus status) throws JsonProcessingException {
        MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
        String response = objectMapper.writeValueAsString(new Hoge(status.value() + "Korrekt"));
        mockServer.expect(requestTo("https://hoges/1"))
                .andRespond(withStatus(status).body(response).contentType(MediaType.APPLICATION_JSON_UTF8));
    }
}

Legen Sie DefaultResponseErrorHandler nicht fest

Sample.java


@Component
public class Sample {

    RestTemplate restTemplate;

    public Sample(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public Hoge getHoge() {
        ResponseEntity<Hoge> response;
        try {
            response = restTemplate.getForEntity("https://hoges/1", Hoge.class);
        } catch (HttpClientErrorException | HttpServerErrorException e) {
            //Kann durch statusCode verzweigt werden
            int statusCode = e.getStatusCode().value();
            return new Hoge(statusCode + "Korrekt");
        }

        return response.getBody();
    }
}

Legen Sie DefaultResponseErrorHandler fest

Dies kann erreicht werden, indem "DefaultResponseErrorHandler" geerbt und als unnötig festgelegt wird.

SampleResponseErrorHandler.java


@Component
public class SampleResponseErrorHandler extends DefaultResponseErrorHandler {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        //Wenn Sie nichts schreiben, wird keine Ausnahme ausgelöst, selbst wenn ein Serverfehler und ein Clientfehler auftreten
    }
}

Sample.java


@Component
public class Sample {

    RestTemplate restTemplate;
    SampleResponseErrorHandler sampleResponseErrorHandler;

    public Sample(RestTemplate restTemplate, SampleResponseErrorHandler sampleResponseErrorHandler) {
        this.restTemplate = restTemplate;
        this.sampleResponseErrorHandler = sampleResponseErrorHandler;
    }

    public Hoge getHoge() {
        //Legen Sie Ihren eigenen definierten Fehlerhandler in RestTemplate fest
        restTemplate.setErrorHandler(sampleResponseErrorHandler);
        ResponseEntity<Hoge> response = restTemplate.getForEntity("https://hoges/1", Hoge.class);
        //Im Beispiel wird es so zurückgegeben, wie es ist, aber hier können Sie mit dem Statuscode, der von ResponseEntity abgerufen werden kann, so viel verzweigen, wie Sie möchten
        return response.getBody();
    }
}

Zusammenfassung

Ich wollte den Statuscode und den Zweig im Detail erhalten, war aber süchtig danach, ihn mit einer Ausnahme nicht abholen zu können.

Recommended Posts

Verzweigungsverarbeitung mit dem Rückgabewert von RestTemplate und dem Statuscode von ResponseEntity in Spring Boot
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
Geben Sie die statische Ressourcencodierung in Spring Boot an
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
[Java] So erhalten Sie den Schlüssel und den Wert, die in Map gespeichert sind, durch iterative Verarbeitung
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
Beispielcode, der die Moustache-Vorlagen-Engine mit Spring Boot verwendet
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Die Frühjahrsvalidierung war in der Reihenfolge von Form und BindingResult wichtig
Formular, das den Wert des sich wiederholenden Elements in Spring MVC erhält
Schreiben Sie den Testcode mit Spring Boot
Reihenfolge der Verarbeitung im Programm
Koexistenz von Flyway in der eingebetteten Datenbank (h2) der Entwicklungsumgebung und der Release-Datenbank (SQL Server) mit Spring Boot
Webanwendungsstruktur nach Java und Verarbeitungsablauf in der Präsentationsschicht
Der Inhalt des Rückgabewerts von executeBatch unterscheidet sich zwischen 11g und 12c
[Java] Verschiedene Methoden, um den in List gespeicherten Wert durch iterative Verarbeitung zu ermitteln
Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf
Beispielcode für die DB-Steuerung durch deklarative Transaktion mit Spring Boot + Spring Data JPA
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Speichern Sie den Rückgabewert des AWS SDK in DynamoDB
Führen Sie ein Spring Boot-Projekt mit VS-Code aus
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
So implementieren Sie den Authentifizierungsprozess durch Angabe von Benutzername und Kennwort in Spring Boot
Extrahiert den Wert von HashMap und gibt das nach dem Wert von value sortierte Ergebnis als Liste zurück.
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
Zählen Sie die Häufigkeit des Auftretens von Wörtern in einem Satz durch Stream-Verarbeitung (Apache Apex).
Beispielcode zum Zuweisen eines Werts in der Eigenschaftendatei zu einem Feld des erwarteten Typs