2014-09-19 3 views
1

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

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

**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 и aplicacion хранилище

@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 аннотация между aplicacion и registrosapp в моих сущностях.

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

ответ

2

Я отвечу сам, чтобы этот вопрос был полезен кому-то, кто борется с этой проблемой. Ответ на этот вопрос тесно связан с - 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, которая появляется в aplicacion, установив аннотацию @RestResource(exported=false) перед установкой registrosApp. Таким образом, aplicacion объект остается как этот

@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 
    } 
} 

и ссылку в aplicacion не показывает ссылку registrosApp Whithin в формате 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 
    } 
} 
+0

Обратите внимание, что 'self', вероятно, не является шаблоном uri. – Evert

 Смежные вопросы

  • Нет связанных вопросов^_^