Уровень веб-сервиса нашего приложения создает 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;
}
}
Любые идеи для универсальной модели?
выглядит прекрасно для меня. Вы правы в дополнительном кодировании, чтобы создать больше подмножеств, но я думаю, что это того стоит, потому что вы можете точно настроить их для просмотров, и они имеют низкое влияние, если базовая модель изменена. – Ritesh