2013-04-05 3 views
1

Уровень веб-сервиса нашего приложения создает JSON из внутренних бизнес-объектов.Spring Web MVC Генерация JSON

Некоторые свойства полностью скрыты, что было легко

public class User { 

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

    // lot more getters and setters 
} 

Из соображений производительности я думал, не всегда обеспечивают полную пользователя (любой другой) объект.

Таким образом, при использовании пользователей/rest/users он должен предоставлять только подмножество свойств для каждого пользователя.

При использовании/отдых/пользователя/{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 = "https://stackoverflow.com/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; 
    } 

} 

Любые идеи для универсальной модели?

+0

выглядит прекрасно для меня. Вы правы в дополнительном кодировании, чтобы создать больше подмножеств, но я думаю, что это того стоит, потому что вы можете точно настроить их для просмотров, и они имеют низкое влияние, если базовая модель изменена. – Ritesh

ответ

1

Посмотрите на Джексона JSON Просмотры и фильтры

http://wiki.fasterxml.com/JacksonJsonViews

http://wiki.fasterxml.com/JacksonFeatureJsonFilter

+0

JSONFilter звучит как решение. Я попробую, но, возможно, вы можете дать мне дополнительную подсказку, как совместить это с контроллером, чтобы достичь моей цели, потому что в настоящее время меня все равно не волнует Джексон, все это делается весной ... – Nabor