[JAVA] Traitement de branche avec la valeur de retour de RestTemplate et le code d'état de ResponseEntity dans Spring Boot

La méthode d'obtention du code d'état change sans définir DefaultResponseErrorHandler La réponse était ici, mais je l'ai ratée.

environnement

Java : 11 JUnit : 4.12 Spring Boot : 2.1.6

Exemple de code commun, qu'il soit défini ou non

SandboxApplication.java


@SpringBootApplication
public class SandboxApplication {

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

    //Enregistrement grosso modo ici
    @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
test du vide public() throws Exception {
        //Série 2xx: ex) OK
        setUpMockRestServer(HttpStatus.OK);
        assertThat(sut.getHoge().getMessage(), is("C'est 200"));

        //Erreur de la série 4xx: ex) NOT_FOUND
        setUpMockRestServer(HttpStatus.NOT_FOUND);
        assertThat(sut.getHoge().getMessage(), is("C'est 404"));

        //Erreur de la série 5xx: ex) INTERNAL_SERVER_ERROR
        setUpMockRestServer(HttpStatus.INTERNAL_SERVER_ERROR);
        assertThat(sut.getHoge().getMessage(), is("C'est 500"));
    }

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

Ne définissez pas DefaultResponseErrorHandler

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) {
            //Peut être ramifié par statusCode
            int statusCode = e.getStatusCode().value();
            return new Hoge(statusCode + "C'est vrai");
        }

        return response.getBody();
    }
}

Définir DefaultResponseErrorHandler

Ceci peut être réalisé en héritant de DefaultResponseErrorHandler et en le définissant comme inutile.

SampleResponseErrorHandler.java


@Component
public class SampleResponseErrorHandler extends DefaultResponseErrorHandler {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        //En n'écrivant rien, il ne déclenche pas d'exception même si une erreur serveur et une erreur client se produisent
    }
}

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() {
        //Définissez votre propre ErrorHandler défini dans RestTemplate
        restTemplate.setErrorHandler(sampleResponseErrorHandler);
        ResponseEntity<Hoge> response = restTemplate.getForEntity("https://hoges/1", Hoge.class);
        //Dans l'exemple, il retourne tel quel, mais ici vous pouvez créer autant de branches que vous le souhaitez avec le code d'état qui peut être obtenu auprès de ResponseEntity
        return response.getBody();
    }
}

Résumé

Je voulais obtenir le code de statut et la branche en détail, mais j'étais accro à ne pas pouvoir le récupérer avec une exception.

Recommended Posts

Traitement de branche avec la valeur de retour de RestTemplate et le code d'état de ResponseEntity dans Spring Boot
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
Spécifiez le codage des ressources statiques dans Spring Boot
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Exemple de code qui utilise le moteur de modèle Moustache avec Spring Boot
Obtenez une instance proxy du composant lui-même dans Spring Boot
La validation de printemps était importante dans l'ordre de Form et BindingResult
Formulaire qui reçoit la valeur de l'élément répétitif dans Spring MVC
Écrire du code de test avec Spring Boot
Ordre de traitement dans le programme
Coexistence de Flyway dans la base de données embarquée (h2) de l'environnement de développement et la base de données des versions (SQL Server) avec Spring Boot
Structure de l'application Web par Java et flux de traitement dans la couche de présentation
Le contenu de la valeur de retour de executeBatch est différent entre 11g et 12c
[Java] Différentes méthodes pour acquérir la valeur stockée dans List par traitement itératif
Organisez les différences de comportement de @NotBlank, @NotEmpty et @NotNull avec Spring Boot + Thymeleaf
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Stocker la valeur de retour du kit SDK AWS dans DynamoDB
Exécuter un projet Spring Boot avec VS Code
Sortie des journaux de demande et de réponse avec Spring Boot
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Vérifions la sensation de Spring Boot + Swagger 2.0
Afficher la tâche Gradle dans le projet Spring Boot
Comment implémenter le processus d'authentification en spécifiant le nom d'utilisateur et le mot de passe dans Spring Boot
Extrait la valeur de HashMap et renvoie le résultat trié par valeur de valeur sous forme de liste.
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour
Compter la fréquence d'apparition des mots dans une phrase par traitement de flux (Apache Apex)
Exemple de code pour attribuer une valeur dans le fichier de propriétés à un champ du type attendu