2013-01-21 70 views
1

我想使用Play的renderJSON函數呈現JSON格式的用戶對象。但是,當我調用它時,我得到一個InvocationTargetException:null錯誤。Play Framework renderJSON給InvocationTargetException

在調試過程中,我發現我在initial-data.yml文件中爲用戶的出生日期給出的值是原因。這是因爲如下:

User(bob): 
    firstName: Bob 
    lastName: Bobson 
    dob: 1979-01-01 

然而,如果我編程方式創建用戶並設置其與新的Date()構造DOB,沒有問題渲染的對象。我甚至試過dob: !!java.util.Date "1979-01-01",如SnakeYML的文檔(http://code.google.com/p/snakeyaml/wiki/Documentation#YAML_syntax)所述無濟於事。

我在這裏做錯了什麼?

+0

你可以發佈你的控制器/模板/模型代碼。 – emt14

回答

3

尤里卡!我懂了!在閱讀了大約9個小時的無盡SO問題之後,我終於通過我厚厚的頭骨瞭解到錯誤的原因不是因爲日期格式,而是因爲默認的Gson渲染器不能很好地(默認情況下)使用雙向釋放,例如@OneToMany和@ManyToOne。

我的解決方案?當將對象呈現爲JSON的時間到來時,「關閉」關係的一側。使用這裏找到的信息:User Defined Exclusion Strategies我已經想出了以下解決方案。

/***************** Models ****************/ 

class Person { 
@Expose 
public int age; 
@Expose 
public String name; 
@Expose 
@OneToMany(mappedBy="owner") 
public Dog dog; 

//Constructors and other code 
} 

class Dog { 
@Expose 
public String name; 
@ManyToOne(fetch=FetchType.Eager) 
public Person owner; 

//Constructor and other code 
} 


/**************Controller********************/ 

public class Application extends Controller { 

public static Gson gson = GsonBuilder.excludeFieldsWithoutExposeAnnotation().create; 

public static void allPersons() { 
    List<Person> people = Person.findAll(); 
    renderJSON(gson.toJson(people)); 

//Error should be taken care of 
} 
} 

使用@expose註釋靜音在渲染時的雙向關係的一個側面肯定解決的問題。現在我只需要弄清楚如何解決這個新的半單側結構。

我在發現本技巧之前使用的另一個庫是FlexJSON。我可能會根據應用程序的後續情況再回到它,因爲它適用於雙向關係,無需您「靜音」一側。它對我來說也比Gson庫更優雅。

非常感謝所有的援助@ emt14。我希望這篇文章可以幫助別人。

+0

是的,我對FlexJSON比Play中的GSON更開心。 –