2015-04-12 86 views
1

我使用的是一个喷射路由,它非常优雅,使用参数符号。不过,我正在处理一些遗留代码,并需要使用java枚举。有没有一些优雅的方式如何将Scala符号转换为Java枚举?Java的斯卡拉符号枚举

因此,所需的代码将如下所示:

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

其中TypNem是java的枚举和导入是Scala的case类。取而代之的

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

您的问题是什么?你的两个片段真的不清楚 – Dici

+0

是否有可能将scala符号直接转换为java enum而不是通过String? – jaksky

回答

1

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

+0

我试图用你的方法,似乎我仍然缺少行中的东西。参数(('adId.as [String],'propertyType.as [TypNemovitosti]))。as(Import){imp => complete adImporterService! imp StatusCodes.Accepted } 从喷雾和RC 500获取NPE - 内部服务器错误。 – jaksky

+0

我复制粘贴代码并获取NPE参数反序列化: java.lang.NullPointerException:null \t at spray.httpx.unmarshalling.DeserializerLowerPriorityImplicits $$ anon $ 4.apply(Deserializer.scala:63)〜[spray-httpx_2。 10-1.3.2.jar:na] ... – jaksky

+0

您尝试使用哪种uri?看起来像你传递null到串行器 –

1

您可以使用一个隐含的声明,以提高可读性:

implicit def strToTypeNe = TypNe.valueOf(pType.toUpperCase())