我正在使用喷涂路由,使用参数符号非常优雅。但是,我正在处理一些遗留代码,需要使用java枚举。有没有一些优雅的方法如何将scala符号转换为java enum?
所以所需的代码如下所示:
post {
parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import) { imp:Import =>
complete {
adImporterService ! imp
StatusCodes.Accepted
}
}
其中TypNem是java enum,Import是scala案例类。而不是
post {
parameters(('adId.as[String], 'propertyType.as[String])) { (aId,pType) =>
complete {
adImporterService ! Import(aId,TypNe.valueOf(pType.toUpperCase()))
StatusCodes.Accepted
}
}
}
答案 0 :(得分:1)
您可以使用隐式声明来提高可读性:
implicit def strToTypeNe = TypNe.valueOf(pType.toUpperCase())
答案 1 :(得分:1)
对于Java Enum PropertyType
public enum PropertyType {
AAA, BBB, CCC
}
您需要提供自定义反序列化器
implicit val propertyTypeDeserializer =
new Deserializer[String, PropertyType] {
def apply(s: String): Deserialized[PropertyType] = {
Try(PropertyType.valueOf(s)) match {
case Success(pt) =>
Right(pt)
case Failure(err) =>
Left(MalformedContent("Wrong property type. Accepted values: ${PropertyType.values}", Some(err)))
}
}
}
def receive: Receive = runRoute {
path("test") {
parameter('prop.as[PropertyType]) { case prop =>
get {
complete(s"Result: $prop. Class: ${prop.getClass}")
}
}
}
}
来自@Dici的解决方案也可以工作且更小,但使用自定义反序列化器,您可以更灵活地处理错误