【问题标题】:Spring Web MVC JSON generationSpring Web MVC JSON 生成
【发布时间】: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


【解决方案1】:

【讨论】:

  • JSONFilter 听起来像是解决方案。我会尝试一下,但也许你可以给我一个额外的提示,如何将它与 Controller 结合以实现我的目标,因为目前我并不真正关心 Jackson,这一切都是由 Spring 完成的......