gpt4 book ai didi

java - Java 中逐步更新对象的替代选项

转载 作者:行者123 更新时间:2023-12-01 19:36:18 24 4
gpt4 key购买 nike

我想说这只是一个好奇心而不是一个问题,但重点是下一个:

我使用 Spring 框架构建了一个简单的 REST API。无需关注所有实现的类和接口(interface),因此下文仅提及概念和逻辑模型。

1.长话短说,假设我有一个基本的用户实体(自动生成的 ID、姓名、电子邮件和密码)和角色实体(自动生成的 ID 及其名称) )。对于两者,还实现了存储库、服务和 Controller ,其中包括所有 CRUD 操作。

用于PUT方法,用于用户更新的函数如下:

@Transactional
public void updateUser(Integer id, User user, Integer roleId) {
Role role = roleRepository.findById(roleId).get();
User userToUpdate = userRepository.findById(id).get();

userToUpdate.setName(user.getName());
userToUpdate.setEmail(user.getEmail());
userToUpdate.setPassword(user.getPassword());
userToUpdate.setRole(role);
userToUpdate.setDevices(user.getDevices());

userRepository.save(userToUpdate);
}

尽管此代码片段工作正常,但由于其逐步 setter 的使用,它让我感到恼火和沮丧。问题是 - 是否有其他选项可以简化给定的摘录(例如 Stream API 的某些功能等)?

2. 问题的第二部分与之前的摘录密切相关。这是另一段代码,负责 GET 方法返回具有特定角色的所有用户。但对于响应实体,所有对象都被包装到 DTO 原型(prototype)中,并随后实现程序实现:

@GetMapping(value = "/roles/{roleId}/users")
public ResponseEntity<Set<UserDTO>> getUsersByRoleId(@PathVariable Integer roleId) {
Set<User> users = userService.getUsersByRoleId(roleId);

Link link = linkTo(methodOn(UserController.class).getAllUsers()).withSelfRel();

Set<UserDTO> userSet = new HashSet<>();
for (User entity : users) {
Link selfLink = new Link(link.getHref() + "/" + entity.getId()).withSelfRel();
UserDTO dto = new UserDTO(entity, selfLink);
userSet.add(dto);
}

return new ResponseEntity<>(userSet, HttpStatus.OK);
}

同样,是否存在任何不同的解决方案来替代那个烦人的“for 循环”?

编辑:我对某些库/框架不感兴趣,但对仅使用纯 Java 的可能简化/替代方案感兴趣

最佳答案

MapStruct是一个流行的库,可以自动创建此类映射代码。

关于java - Java 中逐步更新对象的替代选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57383424/

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