2011-09-09 3 views
2

renderJson()을 통해 내 모델에서 동적 (일시적) 필드를 표시하려고하지만 작동하지 않습니다.재생! 프레임 워크 renderJson 특정 필드를 노출하지 않습니다

@Entity 
public class Room extends Model { 

    public String name; 
    public String code; 
    @Transient 
    public List<Booking> bookings; 

    @Transient 
    @Expose 
    public String resource_uri; 

    public Room(String name, String code) { 
    this.name = name; 
    this.code = code; 
    } 

    public List<Booking> getBookings() { 
    return Booking.find("byRoom", this).fetch(); 
    } 

    public String getResource_uri(){ 
    return "/api/room/" + this.id; //the uri is evaluated dynamically. 
    } 

renderJson 호출이 (Room.findById (2))는 응답으로서이 렌더링 :

{"name":"Room B","code":"R-B","id":2} 

resource_uri 필드가 누락 여기서 일례이다. @Expose 어노테이션은 아무 것도하지 않는 것 같습니다. 프레임 워크가 주석으로 모든 코드를 생성하므로 renderJson의 선언을 볼 수 없습니다.

답변

1

Play! Gson을 사용합니다. 그것은 일시적인 필드를 직렬화하지 않습니다. 이 재생되어 있기 때문에

내가 GSON을 좋아 https://sites.google.com/site/gson/gson-user-guide#TOC-Object-Examples

를 살펴 보자! 상자 밖으로. 등록 시리얼 라이저

public class RoomAdapter implements JsonDeserializer<Room>, JsonSerializer<Room> { 
    public Room deserialize(JsonElement json, Type type, JsonDeserializationContext context){ 
     // Parse the Json to build a Room 
    } 

    public JsonElement serialize(Room room, Type type, JsonSerializationContext context){ 
     // Insert magic here!! 
    } 
} 

: 당신은 뭔가를 자신의, 어댑터를 구축 할 수

Gson gson = new GsonBuilder().registerTypeAdapter(
      Room.class, new RoomAdapter()).create(); 

을 그리고 당신은 직렬화 할 클래스를 지정하는 GSON를 사용

String jsonRoom = gson.toJson(aRoom, Room.class); 
Room aRoom = gson.fromJson(jsonRoom, Room.class); 
+0

임시 필드를 serialize 할 수있는 방법이 있습니까? resource_uri는 REST 인터페이스에 사용되는 메타 데이터 일 뿐이므로 실제로 데이터베이스에 저장하려는 것이 아닙니다. – sw00

+0

더 자세히 살펴보면 Gson이 속성을 serialize 할 수 없음을 발견했습니다. 조금도. 분명히 필드를 찾기 위해 반사를 사용하기 때문입니다. 이 기능이있는 대체 방법은 무엇입니까? FlexJSON? – sw00

+0

당신은 Gson으로 할 수 있습니다. 저는 제 대답에 사용자 정의 어댑터 예제를 게시했습니다. –

1

당신은 또한

public String getResource_uri(){ 
    return "/api/room/" + this.id; //the uri is evaluated dynamically. 
} 

이 당신의 resource_uri 필드가 영원히 널 제안했다가, 아직

@Transient 
@Expose 
public String resource_uri; 

을 가지고 자신의 분야 선언에 차이가있는 것 같습니다?

+0

그러나 null이 아니며, I * System.out.println (u.resource_uri); * 일 때 터미널에 나타납니다. "/ api/room/2"로 표시됩니다. 영구적 인 ORM 필드로 직접 검색되는 것과 달리 "내 URI가 동적으로 평가됩니다"라는 내 의견이 어떻게 혼동 될 수 있는지 확인할 수 있습니다. – sw00

1

재생 framework 2.0은 jackson을 사용하여 json 문자열을 만듭니다. 노출하고 싶지 않은 필드에 @JsonIgnore 주석을 사용하십시오.

관련 문제