我有一个对象设计问题。
我正在用Java构建一个json api。我的系统使用pojos来表示json对象,并使用Jackson将它们从json转换为pojo。每个对象需要在不同的上下文中采用不同的形式,我无法决定是创建一堆单独的类,每个上下文一个,还是尝试在所有情况下使公共类工作。
让我举一个具体的例子。
系统有用户。 api具有添加,修改和删除用途的服务。数据库中有一个用户表。数据库记录如下所示:
{
id: 123, // autoincrement
name: "Bob",
passwordHash: "random string",
unmodifiable: "some string"
}
当您发布/添加用户时,您的pojo不应包含id,因为它是自动生成的。您还希望能够包含一个密码,该密码将被散列并存储在数据库中。
当您对用户进行PUT /更新时,您的pojo不应包含不可修改的字段,但必须包含id,因此您知道要修改的用户。
当您获取/检索用户时,您应该获得除密码哈希以外的所有字段。
因此,代表用户的pojo具有不同的属性,具体取决于您是添加,更新还是检索用户。它在数据库中具有不同的属性。
那么,我应该在我的系统中创建四种不同的pojos并在它们之间进行翻译吗?或者创建一个User类,并尝试使用Jackson视图或其他一些机制使它在不同情况下看起来不同?
我发现后一种方法真的难以管理。
答案 0 :(得分:1)
在我看来,你应该只创建一个具有所有需要属性的POJO
- User
。现在你应该决定你的API
是严格的还是宽大的。如果您的API
严格,则在收到错误的JSON
数据时会返回错误。在宽松版本API
中可以跳过多余的(不必要的)属性。
在我提供示例之前,让我更改密码哈希'属性为'密码'。
添加新用户/ POST
来自客户的JSON
数据:
{
id: 123,
name: "Bob",
password: "random string",
unmodifiable: "some string"
}
严格的版本可以返回例如:
{
"status": "ERROR",
"errors": [
{
"errorType": 1001,
"message": "Id field is not allowed in POST request."
}
]
}
Lenient版本可以返回例如:
{
"status": "SUCCESS",
"warnings": [
"Id field was omitted."
]
}
对于每个CRUD
方法,您可以编写一组单元测试,这些单元测试将以您选择的方式以及允许的内容和不允许的内容来保存信息。