1

我正在尝试使用 Play 的 renderJSON 函数以 JSON 格式呈现用户对象。但是,当我调用它时,我得到一个 InvocationTargetException: null 错误。

在调试时,我发现我在 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)中的说明进行了尝试,但无济于事。

我在这里做错了什么?

4

1 回答 1

3

尤里卡!我懂了!在阅读了无休止的 SO 问题大约 9 小时后,我终于通过我的厚厚的脑袋明白了错误的出现不是因为日期格式,而是因为默认的 Gson 渲染器不能很好地工作(默认情况下)与双向关系,例如@OneToMany 和 @ManyToOne。

我的解决方案?当将对象呈现为 JSON 时,“静音”关系的一侧。使用此处找到的信息:用户定义的排除策略我想出了以下解决方案。

/***************** 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 的所有帮助。我希望这篇文章可以帮助其他人。

于 2013-01-22T14:22:41.683 回答