0

Play 2.1에 JSON RPC를 구축하고 있습니다. 적절한 메서드를 호출하기 위해 RPC 디스패처는 리플렉션을 사용하여 클래스 메서드 인스턴스를 만들고 이름별로 호출합니다. 내가 뭘하고 싶은 것은이 같은 RPC 방법을 정의 할 수있다런타임시 사례 클래스의 이름 만 알면 Play 2.1에서 JsValue를 사례 클래스 인스턴스로 변환 할 수 있습니까?

def create(obj: JsValue) = { 
    val menu: Menu = Json.fromJson[Menu](obj).get 
    collection.insert(menu).map(r => toDirectResult(r)) 
    } 

    def createCustom(obj: JsValue) = { 
    val menu: Menu = Json.fromJson(obj)(Menu.customFormat).get 
    collection.insert(menu).map(r => toDirectResult(r)) 
    } 

:

오른쪽 이제 RPC 방법은 다음과 같습니다

def create(menu: Menu) = { 
    collection.insert(menu).map(r => toDirectResult(r)) 
    } 

문제가 있다는 것입니다 RPC 디스패처는 런타임에 "Menus"라는 클래스에서 "create"라는 메서드를 호출해야하며 메서드 값을 JsValue로 전달할 인수 값을 알고 있습니다. 리플렉션을 통해 RPC 메소드에 대한 인수 및 유형의 수를 확인할 수 있습니다. 인수 유형이 사례 클래스 인 경우 사례 클래스의 동반자 개체에 정의 된 암시 적 포매터 (또는 판독기)를 사용하여 JsValue를 사례 클래스 인스턴스로 변환하는 방법은 무엇입니까?

내가 더 "마법"해결책이 없다는 것을 깨닫게 createCustom 방법에 대한

하지만 스칼라를 배우기 시작 이후 몇 일이 프로그래밍 언어 진정으로 불가능한 것을 발견했다. 어노테이션이나 비슷한 것을 사용하여 암시 적이 아닌 포매터를 지정할 수 있습니까?

답변

0

을 도움이 그 반사 정말 내 문제에 대한 적합한 솔루션입니다 결정했습니다. 컴파일시에 타입 안전성과 적절한 에러보고가 부족하기 때문에 디버그하기가 어렵고 성능에도 영향을 미친다. 그리고 실제로 빌드 할 때 코드를 생성하는 데 필요한 모든 정보가 있습니다. json으로 RPC 발송자에 대한 라우팅이 재생 라우팅시 사용할 수없는 요청 본문에 의존하기 때문에

불행하게도 나는 플레이 라우터를 사용할 수 없습니다. 그러나 본질적으로 RPC 디스패처는 Play 라우터와 동일한 기능을 수행합니다. 그래서 잠시 동안 나는 RPC 루트를 수동으로 코딩 할 것이고 문제의 문제는 해결됩니다. 앞으로는 Play 라우터와 유사한 디스패처 코드를 자동으로 생성하는 SBT 플러그인을 작성할 계획입니다.

0

당신은 PathBinder를 구현해야 ...이 더 신중한 검토 후 http://www.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-pathbindable-with-play-2/

+0

는 불행하게도이 작동하지 않습니다. RPC 메소드는 컨트롤러 내에서 라우트와 맵핑 할 수있는 액션이 ​​아닙니다. 내가하고 있어요 [ExtDirect] (http://www.sencha.com/products/extjs/extdirect) 그래서 클라이언트 측 호출 한 URL는, 다른 모든 것이 JSON으로 게시의 구현입니다. – dcb

관련 문제