[英]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 case類。 代替
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枚舉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提供的解決方案也可以使用,並且更小,但是使用自定義反序列化程序,您可以更靈活地處理錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.