Spray.io проверяет директиву json

Работая с Spray.IO, я создаю сервис, который получает входные данные JSON. Я хочу проверить полезную нагрузку JSON, проверив некоторые из ее полей.

Я не заинтересован в проверке схемы JSON или ошибок синтаксического анализа, а вместо этого проверяю значения поля, как реальный тип поля (например, Integer vs Float)

Я не заинтересован в использовании Scala require, так как это вызовет исключение и не сообщит клиенту ВСЕ ошибки проверки, обнаруженные в одном запросе.

Есть ли для этого встроенная директива/отказ?

Я видел нечто подобное в Play (http://www.playframework.com/documentation/2.2.1/ScalaJsonRequests), и если нет ничего встроенного, как мне самому собрать что-то?


person Roman    schedule 21.05.2014    source источник


Ответы (2)


Вы можете просто использовать требование Scala для класса case, к которому маршалирует json. Пример:

case class AccountSearchQuery (lookupType:Int, lookupValue:String) {
  require(lookupType != 6 || (lookupType == 6 && lookupValue.toLong > 99999), "lookupValue must be a greater than 99999 for lookupType 6 (account number)") 
  require(!lookupValue.isEmpty(), "lookupValue cannot be empty")
}

Когда вы пытаетесь создать класс и одно из требований не выполняется, вы получите исключение. Если это часть маршрута Spray, ответ будет 400 с телом requirement Failed: [failure message from the require statement that failed].

person Gangstead    schedule 21.05.2014
comment
Спасибо @Gangstead за ваш ответ. Я только что отредактировал свой вопрос, так как понял, что ваш подход может быть допустимым, но я бы пропустил все другие ошибки проверки по моему запросу. - person Roman; 21.05.2014

В ответ на обновленный вопрос, чтобы проверить все утверждения, вы можете проявить творческий подход к своему требованию:

case class User(name: String) {
  require(testAll, allTestMessages)
  def test1 = name.length > 5
  def test1M = if(test1) "too short."  else ""

  def test2 = name.length > 10
  def test2M = if(test2) "also too short." else ""

  def testAll = test1 && test2
  def allTestMessages = test1M + test2M 
}
person Gangstead    schedule 21.05.2014