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.
Java : 11 JUnit : 4.12 Spring Boot : 2.1.6
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));
    }
}
HttpClientErrorExceptionHttpServerErrorExceptionChacun des éléments ci-dessus doit être géré partry-catch`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();
    }
}
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();
    }
}
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