java 枚举的 Scala 符号
Scala symbol to java enum
我正在使用喷雾路由,它使用符号作为参数非常优雅。但是我正在处理一些遗留代码并且需要使用 java 枚举。有没有一些优雅的方法如何将 Scala 符号转换为 java 枚举?
因此所需的代码如下所示:
post {
parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import) { imp:Import =>
complete {
adImporterService ! imp
StatusCodes.Accepted
}
}
其中 TypNem 是 java 枚举,而 Import 是一个 scala 案例 class。而不是
post {
parameters(('adId.as[String], 'propertyType.as[String])) { (aId,pType) =>
complete {
adImporterService ! Import(aId,TypNe.valueOf(pType.toUpperCase()))
StatusCodes.Accepted
}
}
}
您可以使用隐式声明来提高可读性:
implicit def strToTypeNe = TypNe.valueOf(pType.toUpperCase())
对于 Java 枚举属性类型
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 的解决方案也可以工作并且更小,但是使用自定义反序列化器你可以更灵活地处理错误
我正在使用喷雾路由,它使用符号作为参数非常优雅。但是我正在处理一些遗留代码并且需要使用 java 枚举。有没有一些优雅的方法如何将 Scala 符号转换为 java 枚举?
因此所需的代码如下所示:
post {
parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import) { imp:Import =>
complete {
adImporterService ! imp
StatusCodes.Accepted
}
}
其中 TypNem 是 java 枚举,而 Import 是一个 scala 案例 class。而不是
post {
parameters(('adId.as[String], 'propertyType.as[String])) { (aId,pType) =>
complete {
adImporterService ! Import(aId,TypNe.valueOf(pType.toUpperCase()))
StatusCodes.Accepted
}
}
}
您可以使用隐式声明来提高可读性:
implicit def strToTypeNe = TypNe.valueOf(pType.toUpperCase())
对于 Java 枚举属性类型
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 的解决方案也可以工作并且更小,但是使用自定义反序列化器你可以更灵活地处理错误