代码之家  ›  专栏  ›  技术社区  ›  Justin Blank

当snakeyaml反序列化对象传递给gatling feeder时,小数字会导致java.lang.ClassCastException

  •  1
  • Justin Blank  · 技术社区  · 7 年前

    我正在运行一个gatling模拟,它使用来自 yml 提供其方案的文件。当我的数字输入足够大,无法将其解析为 java.lang.Integer ,但小数值显然被解析为整数,并导致 ClassCastException 是的。

    import java.io.FileInputStream
    import io.gatling.core.Predef.{Feeder, Simulation}
    import org.yaml.snakeyaml.Yaml
    import org.yaml.snakeyaml.constructor.Constructor
    import io.gatling.core.Predef.{scenario, _}
    import scala.collection.JavaConversions
    
    class TestClass extends Simulation {
    
        val yaml = new Yaml(new Constructor(classOf[Holder]))
        val holder = yaml.load(new FileInputStream("src/test/resources/data.yml")).asInstanceOf[Holder]
        scenario("sim").feed(getUserEmulationFeeder(holder))
    
        def getUserEmulationFeeder(holder:Holder) : Feeder[Long] = {
            val iterable = JavaConversions.iterableAsScalaIterable(holder.numbers)
            iterable.map(l => Map("userToEmulate" -> l)).iterator
        }
    
    }
    

    data.yml 有以下数据:

    numbers:
      - 30687965369
      - 31415388869
      - 2
    

    正在反序列化为:

    import scala.beans.BeanProperty
    
    class Holder {
        @BeanProperty var numbers = new java.util.ArrayList[Long]()
    }
    

    移除 2 修复 类别例外 是的。

    完整的stacktrace是:

    java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at io.gatling.mojo.MainWithArgsInFile.runMain(MainWithArgsInFile.java:50)
        at io.gatling.mojo.MainWithArgsInFile.main(MainWithArgsInFile.java:33)
    Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
        at scala.runtime.BoxesRunTime.unboxToLong(BoxesRunTime.java:105)
        at com.mercurygate.TestClass$$anonfun$getUserEmulationFeeder$1.apply(TestClass.scala:25)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
        at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
        at scala.collection.Iterator$class.foreach(Iterator.scala:893)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
        at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
        at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
        at scala.collection.AbstractTraversable.map(Traversable.scala:104)
        at com.mercurygate.TestClass.getUserEmulationFeeder(TestClass.scala:25)
        at com.mercurygate.TestClass.<init>(TestClass.scala:21)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at io.gatling.app.Gatling$.io$gatling$app$Gatling$$$anonfun$1(Gatling.scala:41)
        at io.gatling.app.Gatling$lambda$1.apply(Gatling.scala:41)
        at io.gatling.app.Gatling$lambda$1.apply(Gatling.scala:41)
        at io.gatling.app.Gatling.run(Gatling.scala:92)
        at io.gatling.app.Gatling.runIfNecessary(Gatling.scala:75)
        at io.gatling.app.Gatling.start(Gatling.scala:65)
        at io.gatling.app.Gatling$.start(Gatling.scala:57)
        at io.gatling.app.Gatling$.fromArgs(Gatling.scala:49)
        at io.gatling.app.Gatling$.main(Gatling.scala:43)
        at io.gatling.app.Gatling.main(Gatling.scala)
        ... 6 more
    

    对不起,这个例子太复杂了。只有当我将snakeyaml、gatling和小输入结合起来时,我才会得到错误。

    0 回复  |  直到 7 年前