寻找更好的解决方案来处理 micronaut 中的全局异常https://docs.micronaut.io/latest/guide/index.html#errorHandling
控制器
@Controller("/category")
public class CategoryController {
@Delete(uri = "/{id}")
public Maybe<HttpResponse> delete(@NotBlank String id) {
LOG.info(String.format("API --> Deleting the specified category"));
return iCategoryManager.Count(id).flatMap(item -> {
if (item > 0) {
iCategoryManager.Delete(id).subscribe();
return Maybe.just(HttpResponse.noContent());
} else
return Maybe.just(HttpResponse.notFound());
});
}
}
Run Code Online (Sandbox Code Playgroud)
iCategoryManager.Count(id)导致如下异常,如何捕获GlobalExceptionHandler上的异常
io.micronaut.core.serialize.exceptions.SerializationException: Incorrect message body size to deserialize to a Long
at io.micronaut.rabbitmq.serdes.JavaLangRabbitMessageSerDes$LongSerDes.deserialize(JavaLangRabbitMessageSerDes.java:314)
at io.micronaut.rabbitmq.serdes.JavaLangRabbitMessageSerDes$LongSerDes.deserialize(JavaLangRabbitMessageSerDes.java:306)
at io.micronaut.rabbitmq.serdes.JavaLangRabbitMessageSerDes.deserialize(JavaLangRabbitMessageSerDes.java:81)
at io.micronaut.rabbitmq.intercept.RabbitMQIntroductionAdvice.deserialize(RabbitMQIntroductionAdvice.java:323)
at io.micronaut.rabbitmq.intercept.RabbitMQIntroductionAdvice.lambda$intercept$22(RabbitMQIntroductionAdvice.java:268)
at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.onNext(FlowableFlatMap.java:132)
at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onNext(RxInstrumentedSubscriber.java:59)
at io.reactivex.internal.operators.flowable.FlowableTimeoutTimed$TimeoutSubscriber.onNext(FlowableTimeoutTimed.java:101)
at io.micronaut.reactive.rxjava2.RxInstrumentedSubscriber.onNext(RxInstrumentedSubscriber.java:59)
at io.reactivex.internal.subscriptions.DeferredScalarSubscription.complete(DeferredScalarSubscription.java:132)
at io.reactivex.internal.operators.single.SingleToFlowable$SingleToFlowableObserver.onSuccess(SingleToFlowable.java:62)
at …Run Code Online (Sandbox Code Playgroud) 我已经使用 Spring Boot 很长时间了。我现在正在研究 Micronaut。
我习惯使用 Sleuth 在日志上自动打印跟踪和跨度 ID。Micronaut 中的 sleuth 相当于什么?
如果没有等效项,如何使用 Jaeger 在 Micronaut 中打印跟踪和跨度 ID?
我的客户端应该从控制器收到一个文件。问题是客户端只接收一个字符串。如何获取控制器返回的流?
这是我的控制器:
@Get("/{databaseName}")
MutableHttpResponse < Object > createDatabaseBackup(String databaseName) {
InputStream inputStreamDatabaseBackup = backupTask.exportBackup(databaseName);
return HttpResponse.ok(new StreamedFile(inputStreamDatabaseBackup, MediaType.APPLICATION_OCTET_STREAM_TYPE));
}
Run Code Online (Sandbox Code Playgroud)
这是我的客户:
@Inject
@Client("${agent.connection-url}")
private RxHttpClient client;
public String getBackup(String dataBaseName) {
return client.toBlocking().retrieve(HttpRequest.GET("/backup/" + dataBaseName));
}
Run Code Online (Sandbox Code Playgroud) 我需要在请求中将参数设置为“不需要”。
我试过:
@Get(value = "/list/{username}")
HttpResponse<?> list(String username, @QueryValue(value = "actionCode") String actionCode) {
...
}
Run Code Online (Sandbox Code Playgroud)
当我发送请求http://localhost:8080/notification/list/00000000000时,会引发以下错误:
{
"message": "Required Parameter [actionCode] not specified",
"path": "/actionCode",
"_links": {
"self": {
"href": "/notification/list/00000000000",
"templated": false
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在努力使用Micronaut HTTPClient多次调用第三方 REST 服务,但没有收到io.micronaut.http.client.exceptions.ReadTimeoutException
要消除第三方依赖性,可以使用调用其自己的服务的简单 Micronaut 应用程序来重现该问题。
控制器示例:
@Controller("/")
public class TestController {
@Inject
private TestClient client;
@Get("service")
String service() {
return "Hello World Service";
}
@Get("mproxy")
String multiproxy() {
StringBuffer sb = new StringBuffer();
for(int i=0;i<20;i++){
sb.append(client.getService());
}
return sb.toString();
}
@Get("proxy")
String proxy() {
return client.getService();
}
}
Run Code Online (Sandbox Code Playgroud)
测试客户端:
@Client("http://localhost:8080")
public interface TestClient {
@Get("/service")
String getService();
}
Run Code Online (Sandbox Code Playgroud)
使用curl、ab 或postman 直接调用/service 端点不会产生错误。
调用 /mproxy 端点将引发异常
ERROR i.m.r.intercept.RecoveryInterceptor - Type [clienttest.TestClient$Intercepted] executed with error: Read Timeout …Run Code Online (Sandbox Code Playgroud)