Как реализовать пейджинг как сквозную задачу, не возвращая много полей, которые мне не нужны в ответе?По сути, я хочу только вернуть список объектов вида + поля «Всего элементов» и «Всего страниц».
Вот как мой код в настоящее время настроен, он должен быть довольно простым: playerController используетplayerService для запроса playerEntities из playerRepository.PlayerService извлекает их из playerRepository, преобразует их в Player POJO и возвращает их.Наконец, pojos снова преобразуются в playerViews.
Я использую POJO, потому что я не хочу возвращать целые сущности из сервиса.Я использую представления в основном по той же причине - я не хочу возвращать больше полей, чем мне нужно.Кроме того, я чувствую, что обслуживание, и взгляды не должны иметь ничего общего с друг другом.Я ошибся?Pojo и view в настоящее время имеют только два одинаковых поля, так что, возможно, некоторые из них излишни.
В любом случае - я хочу, чтобы ответ контроллера содержал поле общего количества страниц.Но я не хочу добавлять такое поле вручную к каждому вызову нумерации страниц, который я собираюсь реализовать.Я попытался вернуть список объектов PageImpl вместо List, который действительно дает мне правильные поля, но в результате получается много дополнительного кода и много дополнительных полей - именно то, чего я пытался избежать.Должен быть лучший, более обобщенный способ?
@RestController
@RequestMapping(value = "/players")
public class PlayerController {
@Autowired
PlayerService playerService;
@Autowired
PlayerViewFactory playerViewFactory;
@GetMapping
public List<PlayerView> getPlayers(@RequestParam String q, @RequestParam int page, @RequestParam int pageSize) throws IOException {
return playerService.getPlayers(q, PageRequest.of(page,pageSize))
.stream()
.map(pl -> playerViewFactory.create(pl.getId(), pl.getName()))
.collect(Collectors.toList());
}
}
@Service
public class PlayerService {
@Autowired
PlayerRepository playerRepository;
public List<Player> getPlayers(String q, Pageable p) {
return playerRepository.findByName(q,p)
.stream()
.map(pl -> toPlayer(pl.getId(), pl.getName()))
.collect(Collectors.toList());
}
private Player toPlayer(int id, String name) {
return new Player(id,name);
}
}
public interface PlayerRepository extends JpaRepository<PlayerEntity, Integer> {
@Query("SELECT p FROM PlayerEntity p WHERE p.name LIKE ?1")
List<PlayerEntity> findByName(String s, Pageable p);
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Player {
private int id;
private String name;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class PlayerView {
private int id;
private String name;
}
@Component
public class PlayerViewFactory {
public PlayerView create(int id, String name) {
return new PlayerView(id,name);
}
}