Я использую распылительную маршрутизацию, которая довольно элегантна, используя символы для параметров. Однако я имею дело с некоторым устаревшим кодом и должен использовать java enum. Есть ли элегантный способ преобразования символа scala в java enum?
Таким образом, желаемый код выглядел бы следующим образом:
post {
parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import) { imp:Import =>
complete {
adImporterService ! imp
StatusCodes.Accepted
}
}
где TypNem - это java enum, а Import - класс case scala. Вместо
post {
parameters(('adId.as[String], 'propertyType.as[String])) { (aId,pType) =>
complete {
adImporterService ! Import(aId,TypNe.valueOf(pType.toUpperCase()))
StatusCodes.Accepted
}
}
}
Для Java Enum PropertyType
public enum PropertyType {
AAA, BBB, CCC
}
Вам необходимо предоставить пользовательский Deserializer
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 также работает и намного меньше, но с пользовательским Deserializer вы более гибки при обработке ошибок
Вы можете использовать неявное объявление для улучшения читаемости:
implicit def strToTypeNe = TypNe.valueOf(pType.toUpperCase())