Класс случая Scala, поля которого могут быть обязательными и необязательными в разных случаях - PullRequest
0 голосов
/ 04 сентября 2018

Я создал две конечные точки отдыха в akka http, который принимает строку в качестве входных данных, анализирует ее с помощью Json4s и затем выполняет обработку на ней. Мой класс дела похож на -

final case class A(id: String, name: String, address: String)

1-ая конечная точка получает только идентификатор, в то время как другое получает все три поля, и я хочу использовать один и тот же класс случая A для обоих. Поэтому я использовал значения по умолчанию для полей имени и адреса, как -

final case class A(id: Stirng, name: String = "", address: String = "")

Это работает хорошо для меня. Но теперь, если я не отправляю поля адреса или имени (или обоих) во второй конечной точке, он не выдает исключение, указывающее, что имя (или адрес) не найдено.

Итак, мой вопрос: могу ли я создать одну конечную точку, в которой идентификатор является обязательным, в то время как другие поля не имеют значения, и другую конечную точку, где каждое поле является обязательным, используя тот же класс случая? Код для разбора строки в классе case -

parse(jsonStr).extract[A]

Надеюсь, вы меня поняли.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Есть два способа достичь того, что вы хотите сделать.

Опция + Проверки

имя и адрес не обязательны, поэтому вам нужно их обработать.

case class A(id: String, name: Option[String], address: Option[String])

val json = """{ "id":"1" }"""

// 1st endpoint
val r = parse(json).extract[A]
r.name.getOrElse("foo")
r.address.getOrElse("bar")

// 2nd endpoint
val r2 = parse(json).extract[A]
r2.name.getOrElse(/* boom! */)

По умолчанию JObject + Merge

или вы можете использовать альтернативный объект JObject для предоставления значений по умолчанию для вашего ввода.

case class A(id: String, name: String, address: String)

val json = """{ "id":"1"  }"""

val defaultValues = JObject(("name", JString("foo")), ("address", JString("bar")))

// 1st endpoint
val r = defaultValues.merge(parse(json)).extract[A]

// 2nd endpoint
val r2 = parse(json).extract[A] // boom! again
0 голосов
/ 04 сентября 2018

Нет, ваш класс дел формально определяет то, что вы ожидаете при вводе. Это не представляет двусмысленности. Вы можете использовать дополнительные и добавлять проверки. Но это просто побеждает цель экстрактора.

...