gpt4 book ai didi

java - Play Framework renderJSON 给出 InvocationTargetException

转载 作者:行者123 更新时间:2023-11-29 05:49:35 26 4
gpt4 key购买 nike

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

在调试时,我发现我在 initial-data.yml 文件中为用户出生日期提供的值是原因。具体如下:

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

但是,如果我以编程方式创建一个 User 并使用 new Date() 构造函数设置他们的 dob,则对象呈现没有问题。我什至尝试过 dob: !!java.util.Date "1979-01-01" 如 SnakeYML 文档 ( http://code.google.com/p/snakeyaml/wiki/Documentation#YAML_syntax ) 中所述,但无济于事。

我在这里做错了什么?

最佳答案

Eureka !我懂了!在阅读了大约 9 个小时无休止的 SO 问题后,我终于通过我厚实的头骨了解到错误不是因为日期格式,而是因为默认的 Gson 渲染器不能很好地(默认情况下)与双向 releationships 如@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 的所有帮助。我希望这篇文章能帮助其他人。

关于java - Play Framework renderJSON 给出 InvocationTargetException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14448460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com