java - Controller 返回包含两个实体而不是一个实体的 JSON

标签 java json spring spring-restcontroller

这是我的 Controller :

 // CREATE NEW TODOITEM FROM SENT JSON
@PostMapping("/todos")
@ResponseStatus(HttpStatus.OK)
public ToDoItem newToDo(
        @RequestBody ToDoItem toDoItem,
        Principal principal
) {
    User currentUser = userService.findLoggedInUser(principal);
    return toDoItemService.addToDo(toDoItem, currentUser);
}

toDoItemService.addToDo:

public ToDoItem addToDo(ToDoItem toDoItem, User user) {
    String toDoTitle = toDoItem.getTitle();
    LocalDate toDoDueDate = toDoItem.getDueDate();
    ToDoItem newToDo = new ToDoItem(user, toDoTitle, toDoDueDate);
    return toDoItemRepository.save(newToDo);
}

ToDoItem 实体(省略的构造函数和 getter/setter):

@Entity
@Table (name = "TO_DO_ITEMS")
public class ToDoItem extends BaseEntity {

@Column(name = "TITLE", nullable = false)
private String title;

@Column(name = "COMPLETED")
private boolean completed;

@Column(name = "DUE_DATE", nullable = false)
@Convert(converter = LocalDateAttributeConverter.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate dueDate;

// a ToDoItem is only associated with one user
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name = "USER_ID")
private User user;

我的toDoItemRepository只是扩展了CrudRepository。

当我拍摄时:

{
"title":"testtodo3",
"dueDate": [
    2015,
    12,
    6
]
}

localhost:8080/todos我得到这个:

{
"id": 1,
"title": "testtodo3",
"completed": false,
"dueDate": [
 2015,
 12,
 6
],
"user": {
"id": 1,
"username": "gruchacz",
"password": "password",
"email": "newUser@example.com"
}
}

为什么当我只返回 ToDoItem 时,我的用户的所有详细信息都可见(就像从 CrudRepository 中保存一样)?我知道我的 ToDoItem 链接到用户,但我希望它仅返回 ID、标题、已完成和到期日期,而不返回用户数据?我知道我可以重写 ToDoItem 实体中的 toString 方法并从该 Controller 返回一个字符串,但它非常不优雅,并且更愿意仅返回 ToDoItem 和 jackson 来处理到 JSON 的转换。

最佳答案

有两种选择供您选择:

1:在ToDoItem中的User字段上添加@JsonIgnore,Jackson将忽略它,或者

2:使用DTO模式,创建另一个值对象以将其传递回HTTP层。

我会推荐第二个选项

关于java - Controller 返回包含两个实体而不是一个实体的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42057555/

相关文章:

javascript - 如何更改 d3js 图表的布局?

javascript - angular js按时间间隔更新json并更新 View

java - 如何制作垃圾邮件测试器

java - Apache Tomcat 8.5.9 中未设置 X-Frame-Options header

java - 具有通用类型的自定义异常

java - Android 高效加载大量图像

java - defaultMethodEndpointAdapter bean 创建错误

java - 如何从ajax网页获取所有文本内容

javascript - 使用文件类型输入发布 $http 请求并获取 req.body 和 req.file 不使用 multer nodejs

java - 如何使用feign客户端实现下载文件