各位好,我这边有一个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