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 방법에 대한하지만 스칼라를 배우기 시작 이후 몇 일이 프로그래밍 언어 진정으로 불가능한 것을 발견했다. 어노테이션이나 비슷한 것을 사용하여 암시 적이 아닌 포매터를 지정할 수 있습니까?
는 불행하게도이 작동하지 않습니다. RPC 메소드는 컨트롤러 내에서 라우트와 맵핑 할 수있는 액션이 아닙니다. 내가하고 있어요 [ExtDirect] (http://www.sencha.com/products/extjs/extdirect) 그래서 클라이언트 측 호출 한 URL는, 다른 모든 것이 JSON으로 게시의 구현입니다. – dcb