Flux.error возвращает 200 http-код, даже если исключено исключение

Вопрос:

Я работаю над проектом с пружинной загрузкой (v2 M3) и spring-webflux. При кодировании функции я вижу, что моя микросервис возвращает мне код состояния Http 200, возвращая ошибку в поток.

Итак, я делаю простой тест: я создаю простой контроллер

@RestController
@RequestMapping(value = "/test")
public class TestController {

@GetMapping(value = "/errors")
public Flux<Object> getErrors() {
return Flux.error(new RuntimeException("test"));
}
}

С помощью простого обработчика исключений:

@ControllerAdvice
public class TestExceptionHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(TestExceptionHandler.class);

@ExceptionHandler(value = { RuntimeException.class })
public ResponseEntity<String> handleServerError(final RuntimeException e) {
LOGGER.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}

И я тестирую результат с помощью webTestClient в тесте интеграции:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource("classpath:test.properties")
public class TestErrorsIT {

@Autowired
private WebTestClient webTestClient;

@Test
public void getErrors() {

this.webTestClient.get().uri("/test/errors").accept(MediaType.APPLICATION_STREAM_JSON).exchange().expectStatus()
.is5xxServerError();
}
}

В результате мой тест завершился неудачно, потому что мой контроллер, который возвращает поток ошибок, возвращает код состояния 200 вместо кода состояния 503 (журнал проверки исключений хорошо прослеживается в моей консоли). Ты знаешь почему?

java.lang.AssertionError: Диапазон значений статуса ответа 200 ожидается: но был:

GET http://localhost: 54432/test/errors WebTestClient-Request-Id: [1] Accept: [application/stream + json]

Без содержания

<200 OK <Content-Type: [application/stream + json] <Transfer-Encoding: [chunked] <Дата: [Пт, 03 Ноя 2017 09:42:53 GMT]

Содержимое пока недоступно

Лучший ответ:

В этом случае приложение имеет зависимость от spring-cloud-starter-eureka, которая сама по себе имеет транзитивную зависимость от spring-boot-starter-web.

Добавление Spring spring-boot-starter-web в приложение Spring Boot превращает его в приложение Spring MVC, которое объясняет это поведение.

Оцените статью
TechArks.Ru
Добавить комментарий