사용자가 드롭 다운 값을 선택하고 입력 상자 등에 텍스트를 입력 할 수있는 상당히 복잡한 양식이 있습니다.
양식은 기본적으로 '고급 검색'유형의 양식입니다.
def search = Action(parse.json) { request =>
val sR = request.body.validate[SearchRequest]
sR.fold(
errors => {
BadRequest(Json.obj("status" -> "KO", "message" -> JsError.toJson(errors)))
},
searchRequest => {
Logger.debug(s"searchRequest is $searchRequest")
val sr = SearchResults(10)
Ok(Json.toJson(sr))
}
)
}
다음 값이있는 드롭 다운 목록이 있다고 가정 해 보겠습니다.
IsGreaThan
IsLessThan
EqualTo
내 SearchRequest는 다음과 같습니다.
case class SearchRequest(operator: String)
그러나 사용자가 잠재적으로 잘못된 데이터, 즉 'IsGreaterThan', 'IsLessThan'등이 아닌 다른 문자열을 보내는 것을 원하지 않습니다.
JSON이 SearchRequest 객체에 바인딩 될 때 어떻게 강력하게 입력 할 수 있습니까?
당신이 찾고 Reads
있는 것은 열거 형에 대한 인스턴스 라고 생각 합니다. 즉 :
특정 SearchOperator
열거 형을 선언합니다 .
object SearchOperator extends Enumeration {
type SearchOperator = Value
val IsGreaThan = Value("IsGreaThan")
val IsLessThan = Value("IsLessThan")
val EqualTo = Value("EqualTo")
}
SearchRequest
케이스 클래스 에서 사용하십시오 .
case class SearchRequest(lhs: Int, operator: SearchOperator, rhs:Int)
읽는 방법을 정의하십시오.
object SearchRequestJson {
implicit val soReads = Reads.enumNameReads(SearchOperator)
implicit val srReads = Json.reads[SearchRequest]
}
핵심 Reads.enumNameReads
은 버전 2.4에서 Play에 추가 된 기능이며, 상황에 맞는 상용구 더미를 저장합니다.
이제 검색 요청의 일부로 잘못된 값을 제출하면 :
{ "lhs": 42, "operator": "NotEqualTo", "rhs": 44 }
나는 얻는다 :
JsError(
List(
(/operator, List(
ValidationError(
List(error.expected.enumstring),
WrappedArray()
)
))
)
)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다