zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【异常】记一次因SpringMVC @GetMapping注解错误使用,导致SQLParsingException: You have an error in your SQL syntax

SpringMVC错误SQL异常 Error in 一次 注解
2023-09-14 09:04:55 时间

一、报错内容

nested exception is org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: com.google.common.util.concurrent.UncheckedExecutionException: org.apache.shardingsphere.sql.parser.exception.SQLParsingException: You have an error in your SQL syntax
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: com.google.common.util.concurrent.UncheckedExecutionException: org.apache.shardingsphere.sql.parser.exception.SQLParsingException: You have an error in your SQL syntax
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
	at com.sun.proxy.$Proxy287.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
	at com.sun.proxy.$Proxy296.selectBatchIds(Unknown Source)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
	at com.sun.proxy.$Proxy297.selectBatchIds(Unknown Source)
	at com.xxx.logic.ids.service.impl.RoleServiceImpl.getRoleAndPermissionsByRoleId(na:43)
	at com.xxx.logic.ids.service.impl.RoleServiceImpl.getRoleAndPermissionsByRoleIdLeaf(na:52)
	at com.xxx.logic.ids.service.impl.RoleServiceImpl$$FastClassBySpringCGLIB$$863a86fb.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
	at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704)
	at com.xxx.logic.ids.service.impl.RoleServiceImpl$$EnhancerBySpringCGLIB$$59bddf51.getRoleAndPermissionsByRoleIdLeaf(<generated>)
	at com.xxx.logic.ids.controller.base.RoleController.getRoleAndPermissionsByRoleIdLeaf(lb:56)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at com.xxx.logic.config.SqlInjectionUtil.doFilter(SqlInjectionUtil.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:186)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:219)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:213)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
	at com.xxx.logic.ids.filter.ValidateCodeFilter.doFilterInternal(ba:87)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:142)
	at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:769)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: com.google.common.util.concurrent.UncheckedExecutionException: org.apache.shardingsphere.sql.parser.exception.SQLParsingException: You have an error in your SQL syntax
	at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:97)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
	at jdk.internal.reflect.GeneratedMethodAccessor285.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
	at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
	at com.sun.proxy.$Proxy367.prepare(Unknown Source)
	at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:87)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
	at com.sun.proxy.$Proxy366.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	at jdk.internal.reflect.GeneratedMethodAccessor334.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)
	... 138 common frames omitted
Caused by: com.google.common.util.concurrent.UncheckedExecutionException: org.apache.shardingsphere.sql.parser.exception.SQLParsingException: You have an error in your SQL syntax
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2051)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3951)
	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4935)
	at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4941)
	at org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine.parse(SQLStatementParserEngine.java:47)
	at org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine.parse(ShardingSphereSQLParserEngine.java:58)
	at org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement.<init>(ShardingSpherePreparedStatement.java:180)
	at org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement.<init>(ShardingSpherePreparedStatement.java:149)
	at org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection.prepareStatement(ShardingSphereConnection.java:80)
	at jdk.internal.reflect.GeneratedMethodAccessor286.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:55)
	at com.sun.proxy.$Proxy113.prepareStatement(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:86)
	at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
	... 161 common frames omitted
Caused by: org.apache.shardingsphere.sql.parser.exception.SQLParsingException: You have an error in your SQL syntax
	at org.apache.shardingsphere.sql.parser.core.database.parser.SQLParserExecutor.twoPhaseParse(SQLParserExecutor.java:65)
	at org.apache.shardingsphere.sql.parser.core.database.parser.SQLParserExecutor.parse(SQLParserExecutor.java:46)
	at org.apache.shardingsphere.sql.parser.api.SQLParserEngine.parse(SQLParserEngine.java:47)
	at org.apache.shardingsphere.infra.parser.sql.SQLStatementParserExecutor.parse(SQLStatementParserExecutor.java:48)
	at org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader.load(SQLStatementCacheLoader.java:41)
	at org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader.load(SQLStatementCacheLoader.java:30)
	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
	... 177 common frames omitted

二、错误说明

开发环境的角色详情等功能,展示异常,异常如下截图
在这里插入图片描述
同事说,你的代码怎么写的?我说我也不知道呢。
那就看看呗。谁要来背这个锅!
功能模块是管理端,代码写在了CommonProvider中,所以启动对应的服务排查即可。

三、问题追溯

3.1 【错误尝试】是不是版本构建的问题?

查看了代码,发现这个开发环境已经N久没有执行Jenkins的代码构建了
最近的变更是引入了ShardingJDBC用于分库分表,但是没有运行到这个开发环境中。
于是,先考虑使用最新的TAG来运行一下Jenkins流失线吧。运行日志如下截图
在这里插入图片描述
执行之后,发现,不行!还是不行!那就不是构建问题了!

3.2 【错误尝试】是不是ShardingJDBC的问题?

因为项目中引入 ShardingJDBC,用于分库分表,而且错误就指向了shardingsphere有误,

‘Caused by:org.apache.shardingsphere.sql.parser.exception.SQLParsingException:
You have an error in your SQL syntax’

网上说,很有解决方案说,可能是因为引入ShardingJDBC后,会暴露更多数据库字段导致关键字冲突,可能导致了一些问题,于是定位问题,找出了实际错误的实体,发现RoleRequest 继承于 BaseRequest
其中order直接和MySQL的关键字(保留字)冲突了。

@Data
@EqualsAndHashCode(callSuper = true)
public class RoleRequest extends BaseRequest {
    // 角色id
    private String roleId;
    // 角色名称
    private String roleName;
    // 创建时间
    private Date createTime;
    // 更新时间
    private Date updateTime;
    // 备注
    private String note;
    //权限列表
    private Set<PermissionEntity> permissions;
    // 权限的ID组
    private String permissionsString;
}
@Data
public class BaseRequest {
    private int pageNum = 1;
    private int currentPage = 1;
    private int pageSize = 10;
    private String order;
    private String sortName;
}

会不会是这个原因,导致了报错呢?于是一顿操作,修改如下

@Override
public RoleResp getRoleAndPermissionsByRoleIdLeaf(String roleId) {
    RoleRequest roleRequest = getRoleAndPermissionsByRoleId(roleId);
    roleRequest.setPermissions(new HashSet<>(BaseTree.findLeafInTree(permissionDao.selectList(null), roleRequest.getPermissions())));
    RoleResp roleResp = new RoleResp();
    BeanUtil.copyProperties(roleRequest, roleResp);
    return roleResp;
}

修改思路:定义新的返回DTO,RoleResp类,并将order字段删除了,看看会不会再报错?
结果验证,还是失败了,说明问题并不是这里!

3.3 【正确尝试】增加日志排除

既然是沙箱环境,那就多几轮日志的打印呗!打印日志协助分析是个好东西。
于是,打印了密密麻麻的日志,如下代码。

@Override
public RoleRequest getRoleAndPermissionsByRoleId(String roleId) {
    log.info("getRoleAndPermissionsByRoleId roleId= {}", roleId);
    RoleEntity roleEntity = roleDao.selectById(roleId);
    log.info("getRoleAndPermissionsByRoleId roleEntity= {}", JSONUtil.toJsonStr(roleEntity));
    RoleRequest roleRequest = ConverterHelper.converter(roleEntity, RoleRequest.class, true);
    log.info("getRoleAndPermissionsByRoleId roleRequest= {}", JSONUtil.toJsonStr(roleRequest));
    List<String> permissionIds = rolePermissionDao.getRolePermissionByRoleId(roleId).stream().map(Role2PermissionEntity::getPermissionId).collect(Collectors.toList());
    log.info("getRoleAndPermissionsByRoleId permissionIds= {}", JSONUtil.toJsonStr(permissionIds));
    List<PermissionEntity> permissions = permissionDao.selectBatchIds(permissionIds);
    log.info("getRoleAndPermissionsByRoleId permissions= {}", JSONUtil.toJsonStr(permissions));
    roleRequest.setPermissions(new HashSet<>(permissions));
    return roleRequest;
}

@Override
public RoleResp getRoleAndPermissionsByRoleIdLeaf(String roleId) {
    log.info("getRoleAndPermissionsByRoleIdLeaf roleId= {}", roleId);
    RoleRequest roleRequest = getRoleAndPermissionsByRoleId(roleId);
    log.info("getRoleAndPermissionsByRoleIdLeaf roleRequest= {}", JSONUtil.toJsonStr(roleRequest));
    roleRequest.setPermissions(new HashSet<>(BaseTree.findLeafInTree(permissionDao.selectList(null), roleRequest.getPermissions())));
    RoleResp roleResp = new RoleResp();
    BeanUtil.copyProperties(roleRequest, roleResp);
    return roleResp;
}

结果,你猜怎么着?Kibana中显示一堆空的数据,详细见以下Kibana中的INFO级别的日志输出截图
在这里插入图片描述
那,究竟是哪个SQL查询,导致了标题的问题呢?

正常我们代码都会对NULL进行捕捉的,


if (ObjectUtil.isNotNull(XXXX)) {}或者是
if (StrUtil.isNotBlank(response) && JSONUtil.isJson(response)) {
但是!这个代码中,完全没有!!!

再往上找一个,selectBatchIds(Unknown Source)

at com.sun.proxy.$Proxy297.selectBatchIds(Unknown Source)
at com.xxx.logic.ids.service.impl.RoleServiceImpl.getRoleAndPermissionsByRoleId(na:43)
at com.xxx.logic.ids.service.impl.RoleServiceImpl.getRoleAndPermissionsByRoleIdLeaf(na:52)
at 

猜到了额,应该就是这个逻辑导致了标题的错误。
List<PermissionEntity> permissions = permissionDao.selectBatchIds(permissionIds);

那为啥一开始的roleId会空呢???那就肯定是Controller层的roleId就是空的了!

3.4 【正确尝试】 为啥Controller获取不到参数roleId?

看看以下代码,思考啊,为什么roleId会空呢???

@Controller
@RequestMapping("roleManage")
public class RoleController {

    @Autowired
    private RoleService roleServiceImpl;
    /**
     * 通过角色id获取此角色所拥有的权限信息
     */
    @GetMapping("/getRoleAndPermissionsByRoleId")
    public ResponseDTO<?> getRoleAndPermissionsByRoleId(String roleId) {
        return ResponseDTO.responseDTO(roleServiceImpl.getRoleAndPermissionsByRoleId(roleId));
    }

    /**
     * 通过角色id获取此角色所拥有的权限信息(仅叶子节点)
     */
    @GetMapping("/getRoleAndPermissionsByRoleIdLeaf")
    public ResponseDTO<?> getRoleAndPermissionsByRoleIdLeaf(String roleId) {
        return ResponseDTO.responseDTO(roleServiceImpl.getRoleAndPermissionsByRoleIdLeaf(roleId));
    }
}

先看看前端的请求先,使用了GET请求,携带了params参数
好吧,又是老问题了!

export function getLeafPermissionByRoleId (roleId) {
  return ajaxRequest({
    url: '/roleManage/getRoleAndPermissionsByRoleIdLeaf',
    method: 'get',
    params: {
      roleId: roleId
    }
  })
}

在这里插入图片描述
这种情况下,只能像以下代码这样修改Controller请求了。

四、问题解决

修改成如下代码,使用@RequestParam 来接收前端传来的参数即可。

@Controller
@RequestMapping("roleManage")
public class RoleController {

    @Autowired
    private RoleService roleServiceImpl;

 /**
     * 通过角色id获取此角色所拥有的权限信息
     */
    @GetMapping("/getRoleAndPermissionsByRoleId")
    public ResponseDTO<?> getRoleAndPermissionsByRoleId(@RequestParam(value = "roleId") String roleId) {
        return ResponseDTO.responseDTO(roleServiceImpl.getRoleAndPermissionsByRoleId(roleId));
    }

    /**
     * 通过角色id获取此角色所拥有的权限信息(仅叶子节点)
     */
    @GetMapping("/getRoleAndPermissionsByRoleIdLeaf")
    public ResponseDTO<?> getRoleAndPermissionsByRoleIdLeaf(@RequestParam(value = "roleId") String roleId) {
        return ResponseDTO.responseDTO(roleServiceImpl.getRoleAndPermissionsByRoleIdLeaf(roleId));
    }

修改之后,再次进Kibana验证数据,哈哈,获取到了!问题解决!

在这里插入图片描述

五、参考文章

【异常】记一次因SpringMVC @GetMapping注解错误使用,导致SQLParsingException: You have an error in your SQL syntax

【异常】记一次因注解@RestController没加(@RestController不会用),导致无法调用Controller层的方法

【异常】Required URI template variable ‘a‘ for method parameter type String is not present

【异常】Required request parameter ‘xxx‘ for method parameter type xxxx is not present

【异常】记一次因注解SpringMVC @RequestParam错误使用导致上传文件接收到的MultipartFile类型为null