it-roy-ru.com

Как настроить загрузку Spring, начиная со страницы 1, а не

boot (1.4.0) «Pageable» для разбивки на страницы. Работает нормально, без проблем. Но по умолчанию значение страницы начинается с «0», но во внешнем интерфейсе значение страницы начинается с «1». Так есть ли какой-нибудь стандартный подход к увеличению значения вместо ручного увеличения номера страницы внутри кода?

public Page<Device> find(DeviceFindCommand deviceFindCommand, Pageable pageable){
//page = 0 //Actual is 0, Expected increment by 1. 
}

Любая помощь должна быть заметной.

После реализации Alan ответов, имеющих следующие проблемы,

1) Тем не менее, я могу получить доступ к нулевой странице, которая возвращает первую страницу (я не знаю, является ли это проблемой или нет, но я хочу получить лучшую ясность).

http: // localhost: 8180/api/v1/books /? page = 3 & size = 2

Отклик

{
    "content": [
{
  "id": "57da9eadbee83fb037a66029",
  .
  .
  .
}{
.
.
.
}
],
    "last": false,
    "totalElements": 5,
    "totalPages": 3,
    "size": 2,
    "number": 2, //strange always getting 1 less than page number.
    "sort": null,
    "first": true,
    "numberOfElements": 2
}

2) "number": 2, в ответе всегда получает на единицу меньше номера страницы. Должен возвращаться индекс текущей страницы.

12
VelNaga

Если вы используете Spring Boot 2.X, вы можете переключиться с WebMvcConfigurerAdapter на свойства приложения. Существует множество свойств для настройки pageable:

# DATA WEB (SpringDataWebProperties)
spring.data.web.pageable.default-page-size=20 # Default page size.
spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.
spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.
spring.data.web.pageable.page-parameter=page # Page index parameter name.
spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.
spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.
spring.data.web.pageable.size-parameter=size # Page size parameter name.
spring.data.web.sort.sort-parameter=sort # Sort parameter name.

Но помните, что даже если вы измените one-indexed-parameter, ответ страницы (класс PageImpl) вернет результаты с номером страницы, начинающимся с нуля. Это может быть немного обманчиво.

6
Przemek Nowak

Spring Boot будет использовать Spring Data под крышками.

Класс Spring Data, который вам нужно настроить, следующий:

org.springframework.data.web.PageableHandlerMethodArgumentResolver

и, в частности, следующий метод:

http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/web/PageableHandlerMethodArgumentResolver.html#setOneIndexedParameters-boolean-

Это позволит вам использовать текущую страницу пользовательского интерфейса, как, например, с первой страницей = 1.

В загрузочном приложении я думаю, что конфиг может выглядеть примерно так:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setOneIndexedParameters(true);
        argumentResolvers.add(resolver);
        super.addArgumentResolvers(argumentResolvers);
    }
}
6
Alan Hay

Я работаю с Spring boot и Vue.js и у меня была эта проблема :) 

У меня много документов, поэтому я реализовал Pageable так: 

    @GetMapping("/all")
public Iterable<Document> getAll(@RequestParam(name = "page", required = false, defaultValue = "0") Integer page)
{
    this.connectToDatabase();

    if(page == null){
        page = 0;
    }

    if(page >= 1){
        // Front-end problem forces us to mad solutions
        page--;
    }

    Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC, "id"));
    Pageable pageable = new PageRequest(page,15, sort);
    Iterable<Document> d = null;
    try{
        d = this.repository.findAll(pageable);
    }catch (Exception e){
        logger.error("Could not find documents in the database.", e);
    }

    return d;
}

В первый раз я вызываю document/all и получаю страницу 0. Затем каждый раз, когда я вызываю страницу из моего интерфейсного приложения, page = page -1;

Поэтому, когда я вызываю страницу 1 из внешнего интерфейса, он переходит на страницу 0 в конце и т.д. 

1
Grechka Vassili

Чтобы получить лучший результат, вам нужно расширить RepositoryRestMvcConfiguration, как показано ниже

@Configuration
   public class RespositoryConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    @Bean
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {

        HateoasPageableHandlerMethodArgumentResolver resolver = super.pageableResolver();
        resolver.setOneIndexedParameters(true);
        return resolver;
    }
}

Затем вы получите правильные ссылки и информацию о нумерации страниц, кроме «число», которое на единицу меньше. Посмотрите результат для страницы = 1,

  "_links": {
    "first": {
      "href": "http://localhost:8080/user/user?page=1&size=5"
    },
    "self": {
      "href": "http://localhost:8080/user/user"
    },
    "next": {
      "href": "http://localhost:8080/user/user?page=2&size=5"
    },
    "last": {
      "href": "http://localhost:8080/user/user?page=2&size=5"
    }
  },
  "page": {
    "size": 5,
    "totalElements": 6,
    "totalPages": 2,
    "number": 0
  }
0
Shafiul