Ссылка href извлекает json без разбивки на страницы - spring data rest jpa

Я начал работать над REST API, используя Spring. Я использую учебный проект gs-accessing-data-rest-initial, который легко загрузить с помощью Spring Tool Suite, чтобы как можно скорее заставить некоторые вещи работать.

Я показал два связанных объекта (aplicacion и registros_app), используя PagingAndSortingRepository, и аннотировал оба с помощью @RepositoryRestResource, что позволяет мне правильно отображать объекты. Результат, который я получаю, когда запрашиваю приложение,

 **GET http://localhost:8090/aplicacion**
{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8090/aplicacion/{?page,size,sort}",
      "templated" : true
    }
  },
  "_embedded" : {
    "aplicacion" : [ {
      "nombre" : "app1",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/aplicacion/2"
        },
        "registrosApp" : {
          "href" : "http://localhost:8090/aplicacion/2/registrosApp"
        },
        "tipoRegistrosApp" : {
          "href" : "http://localhost:8090/aplicacion/2/tipoRegistrosApp"
        }
      }
    }, {
      "nombre" : "app2",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/aplicacion/1"
        },
        "registrosApp" : {
          "href" : "http://localhost:8090/aplicacion/1/registrosApp"
        },
        "tipoRegistrosApp" : {
          "href" : "http://localhost:8090/aplicacion/1/tipoRegistrosApp"
        }
      }
    } ]
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}

Это именно то, что я ожидал получить. Итак, я ожидал получить то же самое, когда перейду к registrosApp, с точки зрения разбиения на страницы; однако, когда я выполняю получение по любой ссылке registrosApp, то, что я получаю из запроса,

**GET http://localhost:8090/aplicacion/2/registrosApp**

{
  "_embedded" : {
    "registrosapp" : [ {
      "datos" : "{\"FechaInicio\":\"2014-09-16 18:08:44\",\"UsoMemoria\":\"UsedMemory:3 FreeMemory:491 Total Memory:495 Max Memory:989 \",\"InfoPool\":\"Active: 2\"}",
      "fecha_hora" : "2014-09-17T14:04:07.000+0000",
      "codTipoRegistro" : 1,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/registrosApp/605"
        },
        "aplicacion" : {
          "href" : "http://localhost:8090/registrosApp/605/aplicacion"
        }
      }
    },{
      "datos" : "{\"FechaInicio\":\"2014-09-16 18:08:44\",\"UsoMemoria\":\"UsedMemory:3 FreeMemory:491 Total Memory:495 Max Memory:989 \",\"InfoPool\":\"Active: 2\"}",
      "fecha_hora" : "2014-09-17T14:04:07.000+0000",
      "codTipoRegistro" : 1,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/registrosApp/667"
        },
        "aplicacion" : {
          "href" : "http://localhost:8090/registrosApp/667/aplicacion"
        }
      }
    } ]
  }
}

Который на самом деле не разбит на страницы. Мне нужно получить json с разбивкой на страницы, когда я перемещаюсь по ссылкам, потому что таблица registrosApp растет очень быстро. ¿Что я могу с этим поделать?

Вот код моего репозитория registrosApp и приложений

@RepositoryRestResource(collectionResourceRel = "registrosapp", path = "registrosApp")
public interface RegistrosAppRepository extends PagingAndSortingRepository<RegistrosApp, Long> {

}

@RepositoryRestResource(collectionResourceRel = "aplicacion", path = "aplicacion")
public interface AplicacionRepository extends PagingAndSortingRepository<Aplicacion, Long> {

//List<Person> findByLastName(@Param("name") String name);

}

И это сущности, которые я определил

@Entity
@Table(name = "registros_app")
public class RegistrosApp {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long idRegistrosApp;
    private String datos;
    private Date fecha_hora;
    private long codTipoRegistro;
    public long getCodTipoRegistro() {
        return codTipoRegistro;
    }
    public void setCodTipoRegistro(long codTipoRegistro) {
        this.codTipoRegistro = codTipoRegistro;
    }
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idAplicacion", nullable = false, insertable = false, updatable = false)
    Aplicacion aplicacion;
    // private long idAplicacion;
    /*
     * public long getRegistros_app() { return idAplicacion; }
     * 
     * public void setRegistros_app(long registros_app) { this.idAplicacion =
     * registros_app; }
     */
    public String getDatos() {
        return datos;
    }
    public void setDatos(String datos) {
        this.datos = datos;
    }
    public Date getFecha_hora() {
        return fecha_hora;
    }
    public void setFecha_hora(Date fecha_hora) {
        this.fecha_hora = fecha_hora;
    }
}

@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Aplicacion {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long aplicacionId;

    private String nombre;
    //relaciones uno a varios
    //relacion con la tabla registros_app
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "idAplicacion", nullable = false)
    private Set<RegistrosApp> registrosApp = null;
    //relacion con la tabla tipo_registro_app
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "idApp", nullable = false)
    private Set<TipoRegistrosApp> tipoRegistrosApp = null;
    public Set<TipoRegistrosApp> getTipoRegistrosApp() {
        return tipoRegistrosApp;
    }
    public void setTipoRegistrosApp(Set<TipoRegistrosApp> tipoRegistrosApp) {
        this.tipoRegistrosApp = tipoRegistrosApp;
    }
    @JsonProperty
    public Set<RegistrosApp> getRegistrosApp() {
        return registrosApp;
    }
    /**
     * Sets list of <code>Address</code>es.
     */
    public void setRegistrosApp(Set<RegistrosApp> rapps) {
        this.registrosApp= rapps;
    }
    @JsonProperty
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
}

Вы можете заметить, что у меня есть аннотация @onetomany между приложением и registrosapp в моих сущностях.

TL; DR Когда я делаю запрос непосредственно в registrosapp, я получаю результат с разбивкой на страницы, как и ожидал. Проблема здесь в том, что когда я перемещаюсь между связанными объектами, я не получаю нужную мне информацию о разбиении на страницы. ¿Что я могу сделать, чтобы получить нумерацию страниц при переходе между объектами? Любая помощь в этом будет оценена по достоинству. Заранее спасибо.


person Luis G. Moré    schedule 19.09.2014    source источник


Ответы (1)


Я отвечу себе, чтобы этот вопрос был полезен для кого-то, кто борется с этой проблемой. Этот ответ тесно связан с - Spring Data Rest Pageable Child Collection -

Что я сделал, так это установил метод в RegistrosAppRepository, чтобы он оставался таким

@RepositoryRestResource(collectionResourceRel = "registrosapp", path = "registrosApp")
public interface RegistrosAppRepository extends PagingAndSortingRepository<RegistrosApp, Long> {

    @RestResource(path = "byAplicacion", rel = "byAplicacion")
    public Page<RegistrosApp> findByAplicacion(@Param("aplicacion_id") Aplicacion aplicacion, Pageable p);

}

Затем я скрываю ссылку на registrosApp, которая появляется в приложении, устанавливая аннотацию @RestResource(exported=false) перед Set of registrosApp. Таким образом, сущность приложения остается такой

@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Aplicacion {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long aplicacionId;

    private String nombre;

    //relaciones uno a varios
    //relacion con la tabla registros_app
    @RestResource(exported=false)
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "idAplicacion", nullable = false)
    private Set<RegistrosApp> registrosApp = null;

    //relacion con la tabla tipo_registro_app
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "idApp", nullable = false)
    private Set<TipoRegistrosApp> tipoRegistrosApp = null;



    public Set<TipoRegistrosApp> getTipoRegistrosApp() {
        return tipoRegistrosApp;
    }

    public void setTipoRegistrosApp(Set<TipoRegistrosApp> tipoRegistrosApp) {
        this.tipoRegistrosApp = tipoRegistrosApp;
    }

    @JsonProperty
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

}

наконец, я могу перемещаться между этими объектами следующим образом:

**GET http://localhost:8090/registrosApp/search/byAplicacion?aplicacion_id=2&page=1&size=1**
{
  "_links" : {
    "next" : {
      "href" : "http://localhost:8090/registrosApp/search/byAplicacion?aplicacion_id=2&page=2&size=1"
    },
    "prev" : {
      "href" : "http://localhost:8090/registrosApp/search/byAplicacion?aplicacion_id=2&page=0&size=1"
    },
    "self" : {
      "href" : "http://localhost:8090/registrosApp/search/byAplicacion?aplicacion_id=2&page=1&size=1{&sort}",
      "templated" : true
    }
  },
  "_embedded" : {
    "registrosapp" : [ {
      "datos" : "{\"FechaInicio\":\"2014-09-16 18:08:44\",\"UsoMemoria\":\"UsedMemory:2 FreeMemory:492 Total Memory:495 Max Memory:989 \",\"InfoPool\":\"Active: 2\"}",
      "fecha_hora" : "2014-09-17T14:04:07.000+0000",
      "codTipoRegistro" : 1,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/registrosApp/593"
        },
        "aplicacion" : {
          "href" : "http://localhost:8090/registrosApp/593/aplicacion"
        }
      }
    } ]
  },
  "page" : {
    "size" : 1,
    "totalElements" : 56,
    "totalPages" : 56,
    "number" : 1
  }
}

и ссылка в приложении не показывает ссылку registrosApp в json:

**GET http://localhost:8090/aplicacion**

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8090/aplicacion{?page,size,sort}",
      "templated" : true
    }
  },
  "_embedded" : {
    "aplicacion" : [ {
      "nombre" : "app1",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/aplicacion/2"
        },
        "tipoRegistrosApp" : {
          "href" : "http://localhost:8090/aplicacion/2/tipoRegistrosApp"
        },
        "aplicacion" : {
          "href" : "http://localhost:8090/aplicacion/2/aplicacion"
        }
      }
    }, {
      "nombre" : "app2",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8090/aplicacion/1"
        },
        "tipoRegistrosApp" : {
          "href" : "http://localhost:8090/aplicacion/1/tipoRegistrosApp"
        },
        "aplicacion" : {
          "href" : "http://localhost:8090/aplicacion/1/aplicacion"
        }
      }
    } ]
  },
  "page" : {
    "size" : 20,
    "totalElements" : 2,
    "totalPages" : 1,
    "number" : 0
  }
}
person Luis G. Moré    schedule 19.09.2014
comment
Обратите внимание, что self, вероятно, не должен быть шаблонным uri. - person Evert; 28.11.2017