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));
}
}
HttpClientErrorException
HttpServerErrorException
Chacun des éléments ci-dessus doit être géré par
try-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