我有一个简单的 Micronaut 控制器,它有 2 个类似的GET
方法,它们返回不同的反应类型。
@Controller
public class MyController {
@Get(uri = "/a", produces = MediaType.APPLICATION_JSON_STREAM)
public Flux<MyPojo> getA() {
return Flux.just("Hi")
.flatMap(s -> Mono.error(new HttpStatusException(HttpStatus.BAD_REQUEST, s)))
.map(o -> new MyPojo());
}
@Get(uri = "/b", produces = MediaType.APPLICATION_JSON_STREAM)
public Mono<MyPojo> getB() {
return Mono.just("Hi")
.flatMap(s -> Mono.error(new HttpStatusException(HttpStatus.BAD_REQUEST, s)))
.map(o -> new MyPojo());
}
}
现在,如果我调用端点,我将获得带有默认错误表示的/b
HTTP 400,这是理想且完美的。io.micronaut.http.hateoas.JsonError
io.micronaut.http.server.exceptions.HttpStatusHandler
{
"message": "Bad Request",
"_embedded": {
"errors": [
{
"message": "Hi"
}
]
},
"_links": {
"self": {
"href": "/b",
"templated": false
}
}
}
但是,如果我调用端点,/a
我会得到没有任何正文的 HTTP 500 错误。日志文件报告以下错误:
2022-01-12 00:45:31.385 ERROR [default-nioEventLoopGroup-2-2] i.m.h.netty.stream.HttpStreamsHandler : Error occurred writing stream response: Hi
io.micronaut.http.exceptions.HttpStatusException: Hi
at com.example.MyController.lambda$getA$6(MyController.java:199)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:386)
at io.micronaut.reactive.reactor.instrument.ReactorSubscriber.onNext(ReactorSubscriber.java:57)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:371)
at io.micronaut.reactive.reactor.instrument.ReactorSubscriber.onSubscribe(ReactorSubscriber.java:50)
at reactor.core.publisher.FluxJust.subscribe(FluxJust.java:68)
at reactor.core.publisher.Flux.subscribe(Flux.java:8468)
...
这似乎是正确的......
JsonError
问题是 -在端点的情况下如何获得正确的 HTTP 代码(400)和默认错误表示( ) /a
?