#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. Это не тот вопрос, на который я собираюсь ответить, поскольку он сильно упрям.