簡體   English   中英

Scala符號轉換為Java枚舉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM