Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何在过滤器的错误处理上连接到micronaut服务器?_Kotlin_Micronaut - Fatal编程技术网

Kotlin 如何在过滤器的错误处理上连接到micronaut服务器?

Kotlin 如何在过滤器的错误处理上连接到micronaut服务器?,kotlin,micronaut,Kotlin,Micronaut,对于micronaut服务器发出的任何4xx或5xx响应,我希望记录响应状态代码及其目标端点。它看起来像一个过滤器将是一个很好的地方,但我似乎不知道如何插入onError处理 例如,这个过滤器 @Filter("/**") class RequestLoggerFilter: OncePerRequestHttpServerFilter() { companion object { private val log = LogManager.getLogger(Re

对于micronaut服务器发出的任何4xx或5xx响应,我希望记录响应状态代码及其目标端点。它看起来像一个过滤器将是一个很好的地方,但我似乎不知道如何插入onError处理

例如,这个过滤器

@Filter("/**")
class RequestLoggerFilter: OncePerRequestHttpServerFilter() {
  companion object {
    private val log = LogManager.getLogger(RequestLoggerFilter::class.java)
  }

  override fun doFilterOnce(request: HttpRequest<*>, chain: ServerFilterChain): Publisher<MutableHttpResponse<*>>? {
    return Publishers.then(chain.proceed(request), ResponseLogger(request))
  }

  class ResponseLogger(private val request: HttpRequest<*>): Consumer<MutableHttpResponse<*>> {
    override fun accept(response: MutableHttpResponse<*>) {
      log.info("Status: ${response.status.code} Endpoint: ${request.path}")
    }
  }
}
@过滤器(“/**”)
类RequestLoggerFilter:OncePerRequestHttpServerFilter(){
伴星{
private val log=LogManager.getLogger(RequestLoggerFilter::class.java)
}
覆盖fun doFilterOnce(请求:HttpRequest,链:ServerFilterChain):发布者{
返回发布者。然后(链。继续(请求),响应记录器(请求))
}
类响应记录器(私有val请求:HttpRequest):使用者{
覆盖趣味接受(响应:MutableHttpResponse){
log.info(“状态:${response.Status.code}端点:${request.path}”)
}
}
}
仅记录成功响应,而不记录4xx或5xx响应。
如何将其与onError处理挂钩?

您可以执行以下操作。创建您自己的ApplicationException(extends RuntimeException),在那里您可以处理应用程序错误,特别是它们如何导致http错误代码。您也可以保存状态代码

例如:

class BadRequestException扩展了ApplicationException{
公共HttpStatus getStatus(){
返回HttpStatus.BAD_请求;
}
}
您可以有多个此ExceptionHandler用于不同的目的

@Slf4j
@产生
@独生子女
@需要(类={ApplicationException.class,ExceptionHandler.class})
公共类ApplicationExceptionHandler实现ExceptionHandler{
@凌驾
公共HttpResponse句柄(最终HttpRequest请求,最终ApplicationException异常){
log.error(“应用程序异常消息={},原因={}”,exception.getMessage(),exception.getCause());
最终字符串消息=exception.getMessage();
最终字符串代码=exception.getClass().getSimpleName();
最终错误代码错误=新错误代码(消息、代码);
log.info(“状态:${exception.getStatus())}端点:${request.path}”)
返回HttpResponse.status(exception.getStatus()).body(错误);
}
}

如果您试图处理Micronaut本机异常,如
400(错误请求)
ConstraintExceptionHandler
生成,则需要
替换
bean才能执行此操作

我在这里发布了一个例子

如果您只想处理响应本身,则可以使用此映射每个响应代码(例如
@Controller
,因此即使使用
全局标志
,也不确定它是否在其他地方工作:

@Error(status = HttpStatus.NOT_FOUND, global = true)  
public HttpResponse notFound(HttpRequest request) {
  <...>
}
@错误(status=HttpStatus.NOT_FOUND,global=true)
公共HttpResponse未找到(HttpRequest请求){
}

您看过
@Error
注释()了吗?我确实查看了错误注释,也许这就是要走的路线。但是如果我创建一个捕获异常的通用错误处理程序,那么我似乎丢失了一些免费提供的不错的默认错误处理(比如io.micronaut.core.convert.exceptions.ConversionErrorException被转化为错误请求)。有没有办法让一般错误处理程序执行一些日志记录,然后将行为传递到正常情况下会发生的行为?我想我真正想要的是发生常规错误处理,然后记录最终结果-400到/path