2016-09-02 6 views
0
플레이 parameter transformation를 사용

라우터 설정 :경로 -> Int 인

GET /search controllers.Search.query(page: Option[Int])

예상대로 search?page=123 작품, search?page=asd을 방문하는 동안 우리가 우리 자신의 래퍼를 사용하고

를 던졌습니다 실패 Try { param.toInt }.toOption을 포함하지만 routes 구성 또는 Action 블록에 구문 분석 예외를 완전히 포함시킬 수있는 다른 방법이 있습니까?

기타 : 매개 변수 변환이 누구에게 표시 되나요? Play source?

답변

0

변경 Option[Int] 액션 내부 Option[String]

def search(param: Option[String]) = Action { req => 
    val page = param.flatMap { Try { _.toInt }.toOption } 
    doSomething(page).map { Ok(_) } 
} 

당신이 사용하는 검색어 매개 변수의 Option[Int] 구문 분석 플레이 루트 레벨에서 발생하는 놀이가 당신을 위해 예외를 처리하고 제어를하지 않을 경우 그 위에. 그래서 확장하거나 사용자 정의를 작성 중복 코드를

def withParamAction(f: Option[Int] => Request[AnyContent] => Result)(paramName: String = "page"):Result = Action { req => 
    f(req.getQueryString(paramName).flatMap { Try { _.toInt }.toOption })(req) 
} 

을 피하기 위해 당신이

사용 withParamAction에게보고 싶습니다 Option[String]를 사용하고 아무것도에 ActionString을 구문 분석 int bindable 상황 customIntBinder 무엇을 필요한다

쿼리 문자열을 복잡한 개체로 구문 분석하려면 QueryStringBindle을 사용하십시오. 다음은 플레이 워드 프로세서의 예제 코드입니다. 그것이 우리가 현재하고있는 일입니다 @pamu

https://www.playframework.com/documentation/2.5.x/ScalaRequestBinders#QueryStringBindable

+0

감사합니다. 나는 각 액션 블록에서 그 보일러 플레이트를 피하기를 바라고있다. 이상적으로는 Int에서 파싱 실패가 빈 옵션으로 평가됩니다. – tgk

+0

@tgk 대답을 편집 .... withParamAction을 사용하십시오. – pamu

+0

고마워요. 멋진 아이디어지만 모든 원시 타입에 대한 N 매개 변수를 처리하는 좀 더 일반적인 솔루션이 필요합니다. 나는 암시 적 파서를 넘어서서 플레이 할 수 있다고 생각한다. https://github.com/playframework/playframework/blob/9f26118a52b8628fe911e6d5fe878d72fe0878b4/framework/src/play/src/main/scala/play/api/mvc/Binders.scala#L62 생각 ? – tgk