【异常】记一次因SpringMVC @GetMapping注解错误使用,导致SQLParsingException: You have an error in your SQL syntax
一、报错内容
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
相关文章
- SpringMVC 接受请求参数、作用域传值
- SpringMVC 数组类型的参数: Cannot generate variable name for non-typed Collection parameter type
- [SpringMVC] - 解决 RequestMappingHandlerAdapter 报红的错误
- springmvc中报错Request processing failed;
- SpringMVC与Ajax交互
- SpringMvc如何获取请求头请求体的消息
- springMVC项目,application.xml springmvc-servlet.xml
- Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建
- 【学亮IT手记】SpringMVC增删改查+map数据返回Controller层代码示例
- 【异常】SpringMVC报错Required URI template variable ‘a‘ for method parameter type String is not present
- 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码
- 【异常】记一次因注解SpringMVC @RequestParam错误使用导致上传文件接收到的MultipartFile类型为null