2014-11-23 5 views
0

저는 대개 Json.writes를 사용할 때 상속 된 필드를 포함하지 않는 것처럼 보입니다. .추상 클래스를 확장 할 때 Json writes가 작동하지 않는 것처럼 보입니다.

implicit val userResponseWrites = Json.writes[UserRespopnse] 

case class UserResponse(var userId: Int, var name: String) extends BaseResponse 

abstract class BaseResponse(var success: Boolean = false, var message: String = "") 

그런 다음 json 응답에는 BaseResponse 클래스의 success 및 message 필드가 포함되지 않습니다.

이 작업이 가능합니까? 아니면 쓰기 기록 장치를 수동으로 써야합니까?

+0

이것은 컴파일되지 않습니다. 'BaseResponse'로 무엇을 얻으 려하고 있으며, 그 값들을 어떻게 채우고 있습니까? 'UserResponse'는 확장시'BaseResponse' 생성자에'success'와'message'를 제공하지 않습니다. –

+0

처음에는 BaseResponse를 확장 할 경우 기본 생성자에 대한 값이 필요합니다. 예 : case 클래스 UserResponse (var userId : Int, var name : String) BaseResponse (true, "message")를 확장합니다. –

+0

필드가 vars가 될 필요가 있는지 다시 생각해 보는 것도 좋습니다. 그것들을 값으로 사용함으로써 객체가 변경되는 것에 대해 걱정할 필요없이 객체를 전달하는 것이 더 안전합니다. –

답변

1

JSON readswrites 매크로는 사례 클래스의 applyunapply 메서드를 각각 사용합니다. 단순히 수업 전체를 읽고 쓰는 것이 아닙니다. 상속을 통해 클래스는 기본적으로 다음과 같습니다

case class UserResponse(var userId: Int, var name: String) { 
    var success: Boolean = false 
    var message: String = "" 
} 

userIdname 회원이 매크로에 의해 선택 될 것이다. 방법 중 하나 (추한의 종류)이 문제를 해결하고 여전히 매크로 게터/추상 클래스에서 세터를 드롭하는 것입니다 사용하고, 케이스 클래스를 정의 할 수 있습니다 :

abstract class BaseResponse(success: Boolean, message: String) 
case class UserResponse(var userId: Int, var name: String, var success: Boolean = false, var message: String = "") 
    extends BaseResponse(success, message) 

내가 볼 수있는 유일한 대안이다 각 클래스에 대해 수동으로 Writes을 정의하십시오.

그런데, 더 많은 컨텍스트 없이는 무엇을 말할 수는 없지만 vars를 사용하는 것보다이 모든 것을 성취하는 것이 더 좋은 방법 일 것입니다.