Лучший подход для создания другого ответа JSON от одного и того же объекта

#spring-boot

#spring-boot

Вопрос:

У меня есть класс объектов User с 20 полями, некоторые из которых являются конфиденциальными полями. У меня есть класс контроллера, в котором есть метод getUser для извлечения всех пользователей из базы данных и отправки ответа JSON. Ниже приведен пример кода для того же:

 @GetMapping("/getUsers")
public UserDT getUsers( Model theModel) {

    List<User> userList;
    userList = userService.findAll();

    return userList;
}
 

Когда я запускаю приведенный выше код, он возвращает все поля из таблицы User / User Entity Class . Вместо отправки всех полей я хотел бы отправить выбранные поля, скажем, Field1 только в Field5.

Конечная цель — иметь несколько представлений для одного и того же класса сущностей. Для URL1 я хотел бы показать только поля от1 до field5 пользовательской таблицы, но для URL2 я хотел бы показать Поля9 , Filed15, Field20.

Нужно ли мне создавать несколько классов сущностей для каждого URL? Пожалуйста, укажите мне наилучшую практику, которой следует придерживаться в таком сценарии.

Комментарии:

1. Хорошим началом будет документация . Особенно этот раздел

Ответ №1:

Предполагая, что вы используете Spring Data JPA, используйте прогнозы.

Итак, создайте разные проекции для разных URL-адресов напишите метод, который возвращает проекцию (или динамическую, как в документации).

 public interface NamesOnlyProjection {

  String getFirstName();
  String getLastName();

}
 
 public interface UserinfoProjection {

  String getUsername();
  String getPassword();
  String getDepartment();
}
 

Затем в вашем репозитории сделайте что-то вроде этого

 
public interface PersonRepository extends JpaRepository<Person, Long> {


  <T> List<T> findAll(Class<T> type);

}
 

Затем вы можете сделать что-то подобное в своем контроллере / сервисе

 @RestController
public class PersonController {

  private final PersonRepository persons;

  @GetMapping("/people/names")
  public List<NamesOnlyProjection> allNames() {
    return persons.findAll(NamesOnlyProjection.class);
  }  

  @GetMapping("/people/users")
  public List<UserinfoProjection> allNames() {
    return persons.findAll(UserinfoProjection.class);
  }  
}
 

Комментарии:

1. Спасибо @M. Deinum. Это полезно. Еще один вопрос: в какой папке мы сохраняем эти взаимодействия в качестве наилучшей практики.

2. Это не тот вопрос, на который я собираюсь ответить, поскольку он сильно упрям.