当前位置: 首页 > 知识库问答 >
问题:

OneErrorResume()不会被调用

韩英锐
2023-03-14

我是spring webflux和reactor的新手,我希望在发生某些特定异常时有一个回退机制,根据我的研究,onErrorResume方法可以做到这一点,但它不会被调用,我得到500个内部服务器错误,而不是触发回退并阻止此错误。

注意:我使用Spring网络流量,这意味着它在Reactor项目的正常行为中做了一些改变

public Mono<Date> getExpirationDateFromToken(String token) {
    return getAllClaimsFromToken(token)
            .onErrorResume(ExpiredJwtException.class, e -> Mono.just(e.getClaims()))
            .map(Claims::getExpiration);
}

public Mono<Claims> getAllClaimsFromToken(String token) {
    return Mono.just(Jwts.parserBuilder()
            .setSigningKey(Base64.getEncoder().encodeToString(secret.getBytes()))
            .build()
            .parseClaimsJws(token)
            .getBody());
}

这是堆栈跟踪

    io.jsonwebtoken.ExpiredJwtException: JWT expired at 2020-03-22T08:17:15Z. Current time: 2020-03-22T08:50:56Z, a difference of 2021835 milliseconds.  Allowed clock skew: 0 milliseconds.
        at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:439) ~[jjwt-impl-0.11.0.jar:0.11.0]
        Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
    Error has been observed at the following site(s):
        |_ checkpoint ⇢ Handler ir.siavash.customerservice.security.controller.AuthController#refreshToken(Mono) [DispatcherHandler]
        |_ checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
        |_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
        |_ checkpoint ⇢ HTTP POST "/auth/refreshToken" [ExceptionHandlingWebHandler]
Stack trace:
        at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:439) ~[jjwt-impl-0.11.0.jar:0.11.0]
        at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:541) ~[jjwt-impl-0.11.0.jar:0.11.0]
        at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:601) ~[jjwt-impl-0.11.0.jar:0.11.0]
        at io.jsonwebtoken.impl.ImmutableJwtParser.parseClaimsJws(ImmutableJwtParser.java:173) ~[jjwt-impl-0.11.0.jar:0.11.0]
        at ir.siavash.customerservice.security.JWTUtil.getAllClaimsFromToken(JWTUtil.java:42) ~[classes/:na]

共有1个答案

温亮
2023-03-14

好的,再看一眼,就清楚了。这是一个常见的错误。反应组件可能很难学习,但离解决方案不远。

单声道。只需将预先计算的值作为参数。因此,您的getAllClaimsFromToken将仅在所有给定给just的代码执行后创建Mono。这意味着您的错误发生在任何反应组件可用于错误管理(组装时间)之前。

相反,您可以使用Mono#fromCallable要求Retor按需计算Jwt令牌,或者仅使用初始字符串创建Mono,然后使用您的函数进行映射。

让我们看看第二种解决方案:

public Mono<Date> getExpirationDateFromToken(String token) {
    return Mono.just(token)
            .map(this::getAllClaimsFromToken)
            .onErrorResume(ExpiredJwtException.class, e -> Mono.just(e.getClaims()))
            .map(Claims::getExpiration);
}

public Claims getAllClaimsFromToken(String token) {
    return Jwts.parserBuilder()
            .setSigningKey(Base64.getEncoder().encodeToString(secret.getBytes()))
            .build()
            .parseClaimsJws(token)
            .getBody();
}
 类似资料:
  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 正如标题所说,我根本无法让Quartz.net工作。我从NuGet获得了最新版本的Quartz.net(2.2.1)、Common.Logging(2.1.2)、Common.Logging.NLog(2.0.0)和NLog(2.1.0)。触发器没有被触发,而且石英绝对没有记录任何东西。我猜我搞砸了配置。 我的应用程序配置: 有一个作业和一个触发器与之相关: 调度程序将启动,作业和触发器将正确添加

  • 我正在尝试在未来的预定时间生成警报。下面是代码 主要活动。Java语言 警报eceiever.java content\u main。xml 舱单 我试图在一分钟后生成警报,但不幸的是什么都没有发生。我在这里做错了什么?此外,即使在手机重启/关机然后打开后,我如何确保我的日程安排仍然有效?

  • 在helper类的静态方法中调用时,它会抛出一个NPE。我所做的是嘲笑MarkupMaker和它的返回值(一个Markup实例)。最后,我希望调用标记实例的。无论我做什么-的调用都是抛出一个NPE。我找不到任何文档告诉我如何在spock中详细模拟方法调用值。 编辑:我添加了示例。的调用返回null,即使我在spock测试中对其进行了嘲弄。 test.groovy java(执行模拟对象的方法) j

  • 在ASP中引入了调用视图组件作为标记助手。NET内核1.1。(请参阅“将视图组件作为标记辅助对象调用”)。但是下面只返回视图中VC部分的测试。似乎

  • 我更新了createInjector调用以包含我的JPAPersisteModule。。。 在我的持久化单元声明如下: