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 に答える