1

我们应用程序的 Web 服务层从内部业务对象创建 JSON。

有些属性是完全隐藏的,这很容易

public class User {

    @JsonIgnore
    public String getHash() {
        return hash;
    }

    // lot more getters and setters
}

由于性能原因,我认为并不总是提供完整的用户(任何其他)对象。

因此,当使用 /rest/users 时,它应该只为每个用户提供一部分属性。

使用 /rest/user/{id} 时,它将提供所有

这也可以通过将用户对象包装到不同的模型中来或多或少地实现,这些模型的吸气剂比用户少。

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;
    }

}

对通用模型有什么想法吗?

4

1 回答 1

1

查看 Jackson 的 JSON 视图和过滤器

http://wiki.fasterxml.com/JacksonJsonViews

http://wiki.fasterxml.com/JacksonFeatureJsonFilter

于 2013-04-06T18:10:35.080 回答