Scala符号到java枚举

时间:2015-04-12 18:44:58

标签: java scala spray spray-dsl

我正在使用喷涂路由,使用参数符号非常优雅。但是,我正在处理一些遗留代码,需要使用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
          }
        }
      }

2 个答案:

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