【发布时间】:2025-12-22 16:05:17
【问题描述】:
我们应用程序的 Web 服务层从内部业务对象创建 JSON。
有些属性是完全隐藏的,这很容易
public class User {
@JsonIgnore
public String getHash() {
return hash;
}
// lot more getters and setters
}
由于性能原因,我认为并不总是提供完整的用户(任何其他)对象。
因此,当使用 /rest/users 时,它应该只为每个用户提供一部分属性。
当使用 /rest/user/{id} 时,它将全部交付
这也可以通过将用户对象包装到不同的模型中来或多或少地实现,这些模型的 getter 比用户少。
public class PublicUserModel {
private User user;
public PublicUserModel(User user) {
this.user = user;
}
public String getFirstname() {
return user.getFirstname();
}
public String getLastname() {
return user.getLastname();
}
}
但这需要大量编码,并且对于不同的视图不太灵活。
理想情况下,有一种方法可以告诉@Controller 哪些属性应该可用。 所有其他代码都需要大量工作。
@Controller
public class MainController {
@Autowired
private UserService userService;
@ResponseBody
@RequestMapping(value = "/users/{id}")
public MyUserModel getUser(@PathVariable String id) {
User user = userService.getUser(id);
if (user != null) {
return new MyUserModel(user);
}
return null;
}
@ResponseBody
@RequestMapping(value = "/users")
public Collection<PublicUserModel> getUsers() {
Collection<User> users = userService.getAllUsers();
Collection<PublicUserModel> publicUsers = new ArrayList<>();
for (User user : users) {
publicUsers.add(new PublicUserModel(user));
}
return publicUsers;
}
}
对通用模型有什么想法吗?
【问题讨论】:
-
对我来说看起来非常好。您对额外编码以创建更多子集是正确的,但我认为这是值得的,因为您可以针对视图微调它们,并且如果基础模型发生更改,它们的影响很小。
标签: json spring rest spring-mvc