Как использовать HATEOAS с пользовательской страницей - PullRequest
0 голосов
/ 17 сентября 2018

Я использую весеннюю загрузку для создания веб-службы.
Я пытаюсь представить HATEOAS конечной точке.Вот модель (DTO):

public class MovieResponse {
    private Long id;
    private String name;
    private Date releaseDate;
    private Time runtime;
    private Float rating;
    private String storyline;
    private String poster;
    private String rated;
    private Date createdAt;
    private List<GenreResponse> genres = new ArrayList<>();
    private List<MovieMediaResponse> videos = new ArrayList<>();
    private List<MovieMediaResponse> photos = new ArrayList<>();
    private List<MovieReviewResponse> reviews = new ArrayList<>();
    private List<MovieCelebrityResponse> cast = new ArrayList<>();
    private List<MovieCelebrityResponse> writers = new ArrayList<>();
    private List<MovieCelebrityResponse> directors = new ArrayList<>();

    // Getters & Setters
}

Также у меня есть PagedResponse, который содержит информацию о странице:

public class PagedResponse<T> {

    private List<T> content;
    private int page;
    private int size;
    private long totalElements;
    private int totalPages;
    private boolean last;

    public PagedResponse() {}

    public PagedResponse(List<T> content, int page, int size, long totalElements, int totalPages, boolean last) {
        this.content = content;
        this.page = page;
        this.size = size;
        this.totalElements = totalElements;
        this.totalPages = totalPages;
        this.last = last;
    }

    // Getters & Setters
}

У меня также есть метод getAllMovies в сервисе, который возвращаетPagedResponse<MovieResponse>.
Теперь вот MovieResourceAssembler

@Component
public class MovieResourceAssembler implements ResourceAssembler<MovieResponse, Resource<MovieResponse>> {

    private EntityLinks entityLinks;

    @Autowired
    public void setEntityLinks(EntityLinks entityLinks) {
        this.entityLinks = entityLinks;
    }

    @Override
    public Resource<MovieResponse> toResource(MovieResponse movieResponse) {
        Link self = entityLinks.linkFor(MovieResponse.class).slash(movieResponse.getId()).withSelfRel();
        Link rel = entityLinks.linkFor(MovieResponse.class).slash(movieResponse.getId()).withRel("movie");
        Link movieGenres = entityLinks.linkFor(MovieResponse.class).slash(movieResponse.getId()).slash("movieGenres").withRel("movieGenres");
        Link movieReviews = entityLinks.linkFor(MovieResponse.class).slash(movieResponse.getId()).slash("movieReviews").withRel("movieReviews");
        return new Resource<>(movieResponse, self, rel, movieGenres, movieReviewsa);
    }
}

Когда я пытаюсь использовать его в моем контроллере, как показано ниже:

@RestController
public class MovieController {

    private MovieService movieService;
    private PagedResourcesAssembler<MovieResponse> pagedAssembler;
    private MovieResourceAssembler movieResourceAssembler;

    @Autowired
    public MovieController(MovieService movieService, PagedResourcesAssembler<MovieResponse> pagedAssembler, MovieResourceAssembler movieResourceAssembler) {
        this.movieService = movieService;
        this.pagedAssembler = pagedAssembler;
        this.movieResourceAssembler = movieResourceAssembler;
    }


    @GetMapping("/movies")
    public ResponseEntity<?> getAllMovies(@RequestParam(value = "page", defaultValue = DEFAULT_PAGE_NUMBER) String page,
                                                      @RequestParam(value = "size", defaultValue = DEFAULT_PAGE_SIZE) String size,
                                                      @RequestParam(value = "sort", defaultValue = "createdAt") String sort,
                                                      @RequestParam(value = "direction", defaultValue = "desc") String direction) {
        PagedResponse<MovieResponse> response = this.movieService.getAllMovies(page, size, sort, direction);
        return ResponseEntity.ok(this.pagedAssembler.toResource(response, this.movieResourceAssembler));
    }
}

получил следующую ошибку:

Не удается разрешить метод 'toResource (com.movies.mmdb.util.PagedResponse, com.movies.mmdb.controller.MovieResourceAssembler)'

в этой строке: return ResponseEntity.ok(this.pagedAssembler.toResource(response, this.movieResourceAssembler));

я думаю toResource принять org.springframework.data.domain.Page; пока я передаю response переменную, которая PagedResponse.

Как я могу это исправить?

1 Ответ

0 голосов
/ 17 сентября 2018

Если метод toResource получает Page<T> в качестве первого параметра, то почему вы не используете этот тип данных? Если вам нужно расширить Page, тогда ваш класс должен реализовать такой интерфейс для выполнения сигнатуры метода:

public class PagedResponse<T> implements Page<MovieResponse>
...