Java中调用getter方法出现数组越界?

新手上路,请多包涵

各位好,我这边有一个dubbo的RPC接口,做了一个同步数据的功能,就是入参有一些参数,对应数据库里的一些字段,不是全部都有,有些字段是缺省的。
然后接口里面,用反射,将入参转化成了DAO的model,反射的代码长这样:

private static B copy(A a) {
    B res = new B();
    try {
        Field[] sourceFields = a.getClass().getDeclaredFields();
        for (Field field : sourceFields) {
            if (!Modifier.isFinal(field.getModifiers())) {
                field.setAccessible(true);
                Field targetField = res.getClass().getDeclaredField(field.getName());
                targetField.setAccessible(true);
                targetField.set(res,field.get(a));
            }
        }
    }catch (Exception e) {
        System.out.println(e);
    }
    return res;
}

转成功了之后,将B对象放到了List里面,然后用mybatis批量插入。
然后我这边出现了一个很奇怪的错误,就是批量插入的时候,调用B对象的某个getter方法的时候出现了数组越界,getter方法也没做啥处理,就是return一个String。
异常堆栈信息:
java.lang.ArrayIndexOutOfBoundsException: 195

    at com.dcits.payment.consumer.fps.dbmodel.PsmsTranMsg.getPredStartAmtFlag(PsmsTranMsg.java:972)
    at sun.reflect.GeneratedMethodAccessor549.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.ibatis.reflection.invoker.MethodInvoker.invoke(MethodInvoker.java:44)
    at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:164)
    at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49)
    at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
    at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:102)
    at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:113)
    at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3338)
    at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:121)
    at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)
    at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
    at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:560)
    at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:524)
    at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46)
    at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
    at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
    at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32)
    at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)
    at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32)
    at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:39)
    at com.dcits.galaxy.dal.mybatis.ShardSqlSessionTemplate$3.execute(ShardSqlSessionTemplate.java:357)
    at com.dcits.galaxy.dal.mybatis.shard.DefaultShardStatementProcessor.executeWith(DefaultShardStatementProcessor.java:124)
    at com.dcits.galaxy.dal.mybatis.shard.DefaultShardStatementProcessor.process(DefaultShardStatementProcessor.java:55)
    at com.dcits.galaxy.dal.mybatis.ShardSqlSessionTemplate.execute(ShardSqlSessionTemplate.java:1296)
    at com.dcits.galaxy.dal.mybatis.ShardSqlSessionTemplate.insertAddBatch(ShardSqlSessionTemplate.java:377)
    at com.dcits.galaxy.dal.mybatis.ShardSqlSessionTemplate.insertAddBatch(ShardSqlSessionTemplate.java:326)
    at com.dcits.galaxy.dal.mybatis.ShardSqlSessionTemplate.insertAddBatch(ShardSqlSessionTemplate.java:315)
    at com.dcits.orion.core.dao.DataAccessor.insertAddBatch(DataAccessor.java:734)
    at com.dcits.orion.core.dao.BaseDao.insertAddBatch(BaseDao.java:525)
    at com.dcits.orion.core.dao.BaseDao.insertAddBatch(BaseDao.java:520)
    at com.dcits.payment.consumer.fps.online.PTS1200311109.process(PTS1200311109.java:62)
    at com.dcits.payment.consumer.fps.online.PTS1200311109.process(PTS1200311109.java:32)
    at com.dcits.payment.business.core.stria.model.AbstractServiceModel.doService(AbstractServiceModel.java:175)
    at com.dcits.payment.business.core.stria.model.AbstractServiceModel.exec(AbstractServiceModel.java:199)
    at com.dcits.payment.business.core.stria.model.RunModel.execute(RunModel.java:35)
    at com.dcits.payment.business.core.stria.model.TransitionModel.execute(TransitionModel.java:46)
    at com.dcits.payment.business.core.stria.model.NodeModel.runOutTransition(NodeModel.java:111)
    at com.dcits.payment.business.core.stria.model.StartModel.exec(StartModel.java:32)
    at com.dcits.payment.business.core.stria.model.NodeModel.execute(NodeModel.java:51)
    at com.dcits.payment.business.core.stria.engine.FlowEngine.execMainFlow(FlowEngine.java:403)
    at com.dcits.payment.business.core.stria.engine.FlowEngine.execFlow(FlowEngine.java:267)
    at com.dcits.payment.business.common.AbstractProcess.execProcess(AbstractProcess.java:255)
    at com.dcits.payment.business.common.AbstractProcess.process(AbstractProcess.java:95)
    at org.apache.dubbo.common.bytecode.Wrapper111.invokeMethod(Wrapper111.java)
    at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47)
    at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84)
            at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:44)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:91)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at com.tencent.tsf.femas.extensions.dubbo.filter.FemasProviderFilter.invoke(FemasProviderFilter.java:66)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:192)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke(InjvmInvoker.java:101)
    at org.apache.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:173)
    at org.apache.dubbo.rpc.protocol.AsyncToSyncInvoker.invoke(AsyncToSyncInvoker.java:52)
    at org.apache.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:78)
    at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:91)
          at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:52)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at com.tencent.tsf.femas.extensions.dubbo.filter.FemasConsumerFilter.invoke(FemasConsumerFilter.java:78)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:69)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:96)
    at org.apache.dubbo.common.bytecode.proxy1.process(proxy1.java)
    at com.dcits.payment.business.core.PaymentBusinessService.executeService(PaymentBusinessService.java:74)
    at com.dcits.payment.business.core.PaymentBusinessService.execute(PaymentBusinessService.java:115)
    at com.dcits.payment.business.core.PaymentBusinessHandler.handle(PaymentBusinessHandler.java:71)
    at org.apache.dubbo.common.bytecode.Wrapper210.invokeMethod(Wrapper210.java)
    at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47)
    at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84)
    at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56)
    at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56)
    at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:44)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
           at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:91)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at com.tencent.tsf.femas.extensions.dubbo.filter.FemasProviderFilter.invoke(FemasProviderFilter.java:66)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:192)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129)
    at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61)
    at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:148)
    at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100)
    at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175)
    at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51)
    at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:41)
    at java.lang.Thread.run(Thread.java:748)

补充:PsmsTranMsg 972行的内容是就是return一个String对象,没做任何处理,数据库中存储该字段的内容是String,mybatis.xml的if也没做特殊处理,就是
<if test="变量名 != null">...</if>
然后RPC方法入参中的972行的这个字段是空的。
请各位大佬帮忙看下

我这边怀疑就是那段反射复制字段的问题,因为我换成BeanUtils.copy就没报错了,但是我无法解释出原有的问题的根因,我本地也复现不了,发生这个问题的环境的Jdk版本是1.8.0_242

阅读 321
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题