【发布时间】:2020-03-27 15:54:57
【问题描述】:
我正在尝试围绕 Java Aws Lambda 客户端编写一个精简的 Scala 包装器。
这个类应该接受 2 个通用参数:
- 输入类型 A - 应该是 case 类,它被序列化为 Json 并发送到 Lambda 函数,或者是 Nothing/Unit 类型,以防打算调用的 Lambda 函数没有接受任何输入参数。
- 输入类型 B - 应该是一个 case 类,它是 Lambda 函数返回的实际反序列化 Json->case 类,或 Unit,以防 Lambda 函数不返回任何内容。
类似的东西:
import com.amazonaws.services.lambda.model.InvokeRequest
import com.amazonaws.services.lambda.{AWSLambda, AWSLambdaClientBuilder}
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{read, write}
class LambdaInvoker[A <: AnyRef, B <: AnyRef](val client: AWSLambda = AWSLambdaClientBuilder.defaultClient()) {
implicit val serialization: Serialization.type = org.json4s.native.Serialization
def call(input: A, function: String): B = {
val request = new InvokeRequest().withFunctionName(function).withPayload(write(input))
val result = client.invoke(request)
val rawJsonResponse = new String(result.getPayload.array(), "UTF-8")
read(rawJsonResponse)
}
}
当我有调用的输入和输出时,这很好用,但不知道什么是最好的“Scala”处理方式,当 A 或 B 不应该出现时。我一直在寻找获取 A 或 B 的运行时类型的方法,检查 Unit,然后以此为基础建立逻辑,但找不到明显的方法(可能是由于类型擦除?)
如果我可以在这里应用不同的模式,没有泛型但使用 Optionals,或者任何其他实现相同目标的东西,那也很棒。
【问题讨论】:
-
这是typeclass 的绝佳用例——基本上我会写类似
class LambdaInvoker[A : Encoder, B : Decoder]的东西。 -
Unit是AnyVal的子类型,而不是AnyRef的子类型。 -
注意:Json4s 是vulnerable under DoS/DoW attacks!