Символ Scala для перечисления java

1

Я использую распылительную маршрутизацию, которая довольно элегантна, используя символы для параметров. Однако я имею дело с некоторым устаревшим кодом и должен использовать 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
          }
        }
      }
  • 0
    Какой у Вас вопрос ? Ваши два фрагмента действительно не ясны
  • 0
    Есть ли возможность конвертировать символ scala в перечисление java напрямую, а не через String?
Теги:
spray
spray-dsl

2 ответа

1
Лучший ответ

Для 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 вы более гибки при обработке ошибок

  • 0
    Я пытался использовать ваш подход, и мне кажется, что я все еще что-то упускаю между строк. параметры (('adId.as [String],' propertyType.as [TypNemovitosti])). as (Импорт) {imp => complete {adImporterService! imp StatusCodes.Accepted} Получение NPE из спрея и RC 500 - внутренняя ошибка сервера.
  • 0
    Я скопировал вставленный код и получил NPE для десериализации параметра: java.lang.NullPointerException: null at spray.httpx.unmarshalling.DeserializerLowerPriorityImplicits $$ anon $ 4.apply (Deserializer.scala: 63) ~ [spray-httpx_2.10-1.3. 2.jar: na] ...
Показать ещё 2 комментария
1

Вы можете использовать неявное объявление для улучшения читаемости:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню