1

我正在使用喷雾路由,它使用符号作为参数非常优雅。但是我正在处理一些遗留代码并且需要使用 java 枚举。有没有一些优雅的方法可以将 scala 符号转换为 java 枚举?

所以所需的代码如下所示:

      post {
        parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import) { imp:Import =>
          complete {
            adImporterService ! imp
            StatusCodes.Accepted
          }
        }

其中 TypNem 是 java 枚举, Import 是一个 scala 案例类。代替

      post {
        parameters(('adId.as[String], 'propertyType.as[String])) { (aId,pType) =>
          complete {
            adImporterService ! Import(aId,TypNe.valueOf(pType.toUpperCase()))
            StatusCodes.Accepted
          }
        }
      }
4

2 回答 2

1

您可以使用隐式声明来提高可读性:

implicit def strToTypeNe = TypNe.valueOf(pType.toUpperCase())
于 2015-04-12T19:03:19.503 回答
1

对于 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 的解决方案也可以工作,而且要小得多,但是使用自定义解串器,您可以更灵活地处理错误

于 2015-04-12T19:11:03.990 回答