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 的解决方案也可以工作并且更小,但是使用自定义反序列化器你可以更灵活地处理错误