@RepositoryRestResource теряет нумерацию страниц при вложении сущностей - PullRequest
0 голосов
/ 23 марта 2020

Я работаю над API и пытаюсь использовать @RepositoryRestResource для получения разбитых на страницы результатов. Это прекрасно работает с одной сущностью и хранилищем. Когда у этой сущности есть двунаправленный дочерний элемент @ OneToMany / @ ManyToOne, вызовы дочерней конечной точки не возвращают элемент страницы. Я сделал пример для демонстрации. Для данного приложения:

@SpringBootApplication
public class NestedDataJpaApplication {
    public static void main(String[] args) {
        SpringApplication.run(NestedDataJpaApplication.class);
    }
}

Объекты моей модели:

@Entity
public class Company {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;

    public Long getId() {
     return id;
    }

    public String getName() {
     return name;
    }

    @OneToMany(targetEntity = Division.class, mappedBy = "company")
    private List<Division> divisions = new ArrayList<>();

    public List<Division> getDivisions() {
     return divisions;
    }
}

@Entity
public class Division {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    String name;

    @ManyToOne
    private Company company;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Company getCompany() {
        return company;
    }
}

И хранилища ресурсов:

@RepositoryRestResource
public interface CompanyRepository extends PagingAndSortingRepository<Company, Long> {}

@RepositoryRestResource
public interface DivisionRepository extends PagingAndSortingRepository<Division, Long> {}

После запуска приложения создайте компанию с:

curl --location --request POST 'http://localhost:8080/companies' 
--header 'Content-Type: application/json' 
--data-raw '{
"name":"Microsoft"
}'

Теперь извлеките результаты, чтобы увидеть информацию о нумерации страниц внизу:

curl --location --requestGET 'http://localhost:8080/companies'{
{
"_embedded" : {
"companies" : [ {
"name" : "Microsoft",
"_links" : {
"self" : {
"href" : "http://localhost:8080/companies/1"
},
"company" : {
"href" : "http://localhost:8080/companies/1"
},
"divisions" : {
"href" : "http://localhost:8080/companies/1/divisions"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/companies{?page,size,sort}",
"templated" : true
},
"profile" : {
"href" : "http://localhost:8080/profile/companies"
}
},
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}

Добавьте деление:

curl --location --request POST 'http://localhost:8080/divisions' 
--header 'Content-Type: application/json' 
--data-raw '{
"name":"Windows",
"company":"http://localhost:8080/companies/1"
}'

Теперь при извлечении делений обратите внимание отсутствующий раздел страницы:

curl --location --request GET 'http://localhost:8080/companies/1/divisions'

{
"_embedded" : {
"divisions" : [ {
"name" : "Windows",
"_links" : {
"self" : {
"href" : "http://localhost:8080/divisions/2"
},
"division" : {
"href" : "http://localhost:8080/divisions/2"
},
"company" : {
"href" : "http://localhost:8080/divisions/2/company"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/companies/1/divisions"
}
}
}

Ожидаемое поведение - дочерний элемент будет иметь раздел страницы так же, как родительский.

...