常州网站建设找思创,建筑网片规范,除wordpress,课堂网站开发最近开发过程中#xff0c;居然碰到了一个Arrays.asList的错#xff0c;怎么个场景呢#xff1f;传参一个用固定符号拼接的字符串#xff0c;需要转成集合然后再myBatis里in判断。然后就报错了。
一、代码层面
service层面#xff1a;
shortDetailUrlList Arrays.asLi…最近开发过程中居然碰到了一个Arrays.asList的错怎么个场景呢传参一个用固定符号拼接的字符串需要转成集合然后再myBatis里in判断。然后就报错了。
一、代码层面
service层面
shortDetailUrlList Arrays.asList(params.getShortDetailUrl().split(-));mybatis层面
if testshortDetailUrlList ! null and shortDetailUrlList.size() 0and tcp.short_url inforeach itemshortDetailUrl collectionshortDetailUrlList open( separator, close)indexindex#{shortDetailUrl}/foreach/if二、错误日志
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.reflect.InaccessibleObjectException: Unable to make public int java.util.Arrays$ArrayList.size() accessible: module java.base does not opens java.util to unnamed module 65e579dc
### Cause: java.lang.reflect.InaccessibleObjectException: Unable to make public int java.util.Arrays$ArrayList.size() accessible: module java.base does not opens java.util to unnamed module 65e579dcat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)at jdk.proxy2/jdk.proxy2.$Proxy103.selectList(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:145)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)at jdk.proxy2/jdk.proxy2.$Proxy152.getConstructInfoByReceiveId(Unknown Source)at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)at java.base/java.lang.reflect.Method.invoke(Method.java:577)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 jdk.proxy2/jdk.proxy2.$Proxy153.getConstructInfoByReceiveId(Unknown Source)at com.meta.image.admin.service.impl.ReportBaseServiceImpl.getReportConstructInfo(ReportBaseServiceImpl.java:389)at com.meta.image.admin.controller.ReportBaseV2Controller.getReportConstructInfo(ReportBaseV2Controller.java:75)at com.meta.image.admin.controller.ReportBaseV2Controller$$FastClassBySpringCGLIB$$b659f1a1.invoke(generated)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)三、日志分析
根据错误日志可以晓得数据库报错了然后还是反射的错。错误的根源就是
Unable to make public int java.util.Arrays$ArrayList.size() accessible那这错误的根源到底是什么呢那还得从Array.asList分析入手啊。。。
四、Array.asList的坑
1、使用场景
一般我们字符串切割很容易想到额就是它了固定符号分割获取一个集合列表。
【注意】 - 该方法适用于对象型数据的数组String、Integer…- 该方法不建议使用于基本数据类型的数组byte,short,int,long,float,double,boolean- 该方法将数组与List列表链接起来当更新其一个时另一个自动更新- 不支持add()、remove()、clear()等方法2、为何说是一个坑
① 此方法得到的List的长度是不可改变的看源码就会一目了然
当你向这个List添加或删除一个元素时例如 list.add(“d”);程序就会抛出异尝java.lang.UnsupportedOperationException。
public static T ListT asList(T... a) {return new ArrayList(a);}/*** serial include*/private static class ArrayListE extends AbstractListEimplements RandomAccess, java.io.Serializable{private static final long serialVersionUID -2764017481108945198L;private final E[] a;ArrayList(E[] array) {a Objects.requireNonNull(array);}
看源码你就会发现每次调用asList,都是new一个新的来操作增删。
②虽然也是集合但是确实内部类和我们所用的java.util.arrayList是不一样的 回到第三点为何会报反射异常因为内部类mybatis去获取size的时候是获取不到的。解决办法也有很多种。