【发布时间】:2019-06-03 12:29:02
【问题描述】:
我正在使用他们的 POJO handler 构建一个 AWS lambda 函数,但是通过 RequestHandler 接口进行抽象会导致类型被擦除。发生这种情况时,AWS 无法转换为我的 lambda 函数的输入类型:
java.util.LinkedHashMap cannot be cast to com.amazonaws.services.lambda.runtime.events.SNSEvent: java.lang.ClassCastException
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.amazonaws.services.lambda.runtime.events.SNSEvent
以下代码在上传到 AWS 时有效:
import com.amazonaws.services.lambda.runtime._
import com.amazonaws.services.lambda.runtime.events.SNSEvent
// Only working version
class PojoTest1 extends Handler1[SNSEvent]{
override def handleRequest(input: SNSEvent, context: Context): Unit =
println(s"message: ${input.getRecords.get(0).getSNS.getMessage}")
}
trait Handler1[Event] extends RequestHandler[Event, Unit]{
override def handleRequest(input: Event, context: Context): Unit
}
现在因为我使用的是 Scala,所以我正在抽象出具有通用特征的 Java RequestHandler。以下是不起作用的缩小示例:
// Doesn't work
class PojoTest2 extends Handler2[SNSEvent]{
override def act(input: SNSEvent): Unit =
println(s"message: ${input.getRecords.get(0).getSNS.getMessage}")
}
trait Handler2[Event] extends RequestHandler[Event, Unit]{
def act(input: Event): Unit
override def handleRequest(input: Event, context: Context): Unit = act(input)
}
当我运行 javap PojoTest1.class 时,这是使一切正常的方法:
public void handleRequest(com.amazonaws.services.lambda.runtime.events.SNSEvent, com.amazonaws.services.lambda.runtime.Context);
当我运行javap PojoTest2.class时,你可以从这个签名中看到SNSEvent的类型已经被擦除为Object:
public void handleRequest(java.lang.Object, com.amazonaws.services.lambda.runtime.Context);
这看起来与SI-8905 中描述的问题完全相同。不幸的是,发布的解决方法似乎也不起作用:
// Doesn't work
abstract class Handler3[T] extends Handler2[T]
class PojoTest3 extends Handler3[SNSEvent]{
override def act(input: SNSEvent): Unit =
println(s"message: ${input.getRecords.get(0).getSNS.getMessage}")
}
即使直接扩展抽象类也不会产生更好的结果:
// Doesn't work
class PojoTest4 extends Handler4[SNSEvent]{
override def act(input: SNSEvent): Unit =
println(s"message: ${input.getRecords.get(0).getSNS.getMessage}")
}
abstract class Handler4[Event] extends RequestHandler[Event, Unit] {
def act(input: Event): Unit
override def handleRequest(input: Event, context: Context): Unit = act(input)
}
当我在任何不起作用的类上使用 javap 时,我仍然会得到与擦除类型相同的方法签名。
我正在使用 Scala 2.12.7、sbt 1.1.2 和 sbt-assembly 0.14.8。
我正在寻找任何解决方法来解决这个问题。
【问题讨论】:
标签: scala amazon-web-services aws-lambda