我有例外:
open class CustomException(open val code: String, override val message: String) : RuntimeException(message)
其他自定义异常从它继承:
class DataAccessException(override val code: String, override val message: String) : CustomException(code, message)
class NoMatchingValueException(override val code: String, override val message: String) : CustomException(code, message)
class ApiException(override val code: String, override val message: String) : CustomException(code, message)
class JwtAuthenticationException(override val code: String, override val message: String) : CustomException(code, message)
exceptionhandler
处理它们。现在看起来就像是在那里:
@ExceptionHandler(value = [DataAccessException::class])
fun handle(exception: DataAccessException): ResponseEntity<AbstractDto> =
ResponseEntity.ok(AbstractDto(exception.code, exception.message))
@ExceptionHandler(value = [NoMatchingValueException::class])
fun handle(exception: NoMatchingValueException): ResponseEntity<AbstractDto> =
ResponseEntity.ok(AbstractDto(exception.code, exception.message))
@ExceptionHandler(value = [ApiException::class])
fun handle(exception: ApiException): ResponseEntity<AbstractDto> =
ResponseEntity.ok(AbstractDto(exception.code, exception.message))
@ExceptionHandler(value = [JwtAuthenticationException::class])
fun handle(exception: JwtAuthenticationException): ResponseEntity<AbstractDto> =
ResponseEntity
.status(HttpStatus.OK)
.body(AbstractDto(StatusCode.UNAUTHORIZED.name, exception.message!!))
ExceptionHandler正确处理所有自定义异常,排除jwtauthenticationexception
在验证jwm-token时,此异常只在一种情况下抛出。
try {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getExpiration().after(new Date());
} catch (IllegalArgumentException e) {
throw new JwtAuthenticationException(StatusCode.UNAUTHORIZED.name(), "JWT token is invalid");
} catch (ExpiredJwtException e) {
throw new JwtAuthenticationException(StatusCode.UNAUTHORIZED.name(), "JWT token expired.");
}
这样,Console中有3个stacktraces日志:
JwtAuthenticationException: JWT token expired.
...
ERROR 22059 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] threw exception
JwtAuthenticationException: JWT token expired.
...
ERROR 22059 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]
JwtAuthenticationException: JWT token expired.
仅前端重装
HTTP Status 500 – Internal Server Error
请告诉我,怎么了。
附注。完整StackTrace:
null
2019-07-14 17:04:38.791错误24060---[nio-8081-exec-1]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet[dispatcherServlet]的servlet.Service()引发异常
ru.xpendence.exceptions.jwtauthenticationexception:JWT令牌过期。在ru.xpendence.config.security.jwt.jwt.jwtTokenProvider.validate(jwtTokenProvider.java:84)~[类/:na]在ru.xpendence.config.security.jwt.jwtTokenFilter.doFilter(jwtTokenFilter.java:34)~[类/:na]在org.springframework.security.web.filterchainproxy$virtualfilterchain.doFilter在org.springframework.security.web.context.securitycontextpersistencefilter.java:105)~[spring-security-web-5.1.5.release.jar:5.1.5.release.jar:5.1.5.release]在org.springframework.security.web.web.5.1.5.release.jar:5.1.5.release]在elegate(DelegatingFilterProxy.java:357)~[Spring-Web-5.1.7.release.jar:5.1.7.release]在org.springframework.web.filter.doFilter(DelegatingFilterProxy.java:270)~[Spring-Web-5.1.7.release.jar:5.1.7.release]在org.apache.catalina.core.applicationfilterchain.internaldoFilter(E-9.0.19.jar:9.0.19]在org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.394)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在org.apache.catalina.core.StandardHostValve.Status(StandardHostValve.253)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在CTProcessorLight.Process(AbstractProcessorLight.java:66)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在org.apache.coyote.AbstractProtocol$ConnectionHandler.Process(AbstractProtocol.java:836)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在org.apache.tomcat.util.net.nioEndpoint$SocketProcessor.dorun(NioEndpoint.java:1747)
2019-07-14 17:04:38.791错误24060---[nio-8081-exec-1]O.A.C.C.C.[Tomcat].[localhost]:异常处理错误页[ErrorCode=0,Location=/ERROR]
ru.xpendence.exceptions.jwtauthenticationexception:JWT令牌过期。在ru.xpendence.config.security.jwt.jwt.jwtTokenProvider.validate(jwtTokenProvider.java:84)~[类/:na]在ru.xpendence.config.security.jwt.jwtTokenFilter.doFilter(jwtTokenFilter.java:34)~[类/:na]在org.springframework.security.web.filterchainproxy$virtualfilterchain.doFilter在org.springframework.security.web.context.securitycontextpersistencefilter.java:105)~[spring-security-web-5.1.5.release.jar:5.1.5.release.jar:5.1.5.release]在org.springframework.security.web.web.5.1.5.release.jar:5.1.5.release]在elegate(DelegatingFilterProxy.java:357)~[Spring-Web-5.1.7.release.jar:5.1.7.release]在org.springframework.web.filter.doFilter(DelegatingFilterProxy.java:270)~[Spring-Web-5.1.7.release.jar:5.1.7.release]在org.apache.catalina.core.applicationfilterchain.internaldoFilter(-core-9.0.19.jar:9.0.19]在org.apache.catalina.core.standardhostvalve.custom(standardhostvalve.394)[tomcat-embedd-core-9.0.19.jar:9.0.19]在org.apache.catalina.core.standardhostvalve.status(standardhostvalve.Java:253)[tomcat-embedd-core-9.0.19.jar:9.0.19]在org.apache.catalina.core.standardhostvalve.throwable(standardhostvalve.Java:348)StractProcessorLight.Process(AbstractProcessorLight.java:66)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在org.apache.coyote.AbstractProtocol.java:836)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在org.apache.tomcat.util.net.nioEndpoint$SocketProcessor.dorun(NioEndpoint.java:1747)[Tomcat-Embedd-Core-9.0.19.jar:9.0.19]在
该异常不是从spring控制器抛出的,因此它不能被controlleradvice
捕获,正如其名称和文档所示,controlleradvice
建议的是控制器,而不是过滤器。
我使用Spring的@ControllerAdvice和@ExceptionHandler进行异常处理。任何方法都会从Controller中抛出自定义异常,并由相应的@ExceptionHandler处理它。如果发生运行时异常(例如任何HibernateException),那么它将抛出运行时异常,并且我没有任何@ExceptionHandler用于运行时异常。
问题内容: 我正在使用Spring MVC 并处理REST Api的所有异常。对于Web MVC控制器抛出的异常,它工作正常,但对于Spring Security自定义过滤器抛出的异常,它不工作,因为它们在调用控制器方法之前运行。 我有一个自定义的spring安全过滤器,它执行基于令牌的身份验证: 使用此自定义入口点: 并使用此类来全局处理异常: 我需要做的是返回一个详细的JSON主体,即使对于s
我使用Spring MVC的和来处理REST API的所有异常。它对web mvc控制器引发的异常很好,但对spring security自定义筛选器引发的异常不起作用,因为它们在调用控制器方法之前运行。 我有一个自定义Spring Security筛选器,它执行基于令牌的身份验证: 使用此自定义入口点:
我正在使用Spring Boot 1.5.9开发我的应用程序。我需要实现jwt身份验证,我使用了jjwt库。以下代码来自我的自定义身份验证安全筛选器,它继承自。在这里,我试图从令牌解析用户名,当自动解析用户名时,jwt会验证用户名,并检查令牌的过期时间。我调试了它,它可以工作,所以接下来我想向客户端应用发送正确的消息,说明身份验证失败的原因。我想抛出一个ExpiredJwtException,并使
我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。
我不知道该怎么办。 当我试图从解析器获取语法错误的数量时,它显示0。 编辑: 它返回null。