2016-04-10 9 views
0

私は、Spring DataからPageとPageableインターフェースを試しています。Spring Dataページング可能なレスポンスのJSON名を変更することはできますか?

{"content": 
[... my objects ...], 
"last":false, 
"totalPages":7, 
"totalElements":13, 
"size":2, 
"number":0, 
"sort":null, 
"first":true, 
"numberOfElements":2} 

これらのJSON要素の名前はどのように変更できますか?

私が働く会社はJSON命名規則の厳格なガイドラインを持っていますので、すぐに使用できませんが、これらの名前を変更することができれば使用できます。

答えて

0

は使用してみてください:

 @Entity 
public class City { 
    @id 
    Long id; 
    String name; 

    @JsonProperty("label") 
    public String getName() { return name; } 

    public void setName(String name){ this.name = name; } 

    @JsonProperty("value") 
    public Long getId() { return id; } 

    public void setName(Long id){ this.id = id; } 
} 

reference

2

クラスを作成し、多分org.springframework.data.domain.Pageを実装し、引数として別のPageを取得するコンストラクタを持っている、PageWrapperと呼ばれます。 ラップされたPageインスタンスへのすべてのメソッド呼び出しを委譲します。 その後、@JsonProperty注釈を使用して、シリアル化されたJSONのフィールドの名前を変更できます。 Page(実際にはPageImpl)のインスタンスをPageWrapperのインスタンスで囲み、リソースメソッドの戻り値の型をPageWrapperに変更します。

0

最後に言ったように、最善のことはページラッパーを使用することです。つまり、公開するリソースの表現を作成するページを作成する必要があります。

これは、ページング可能なインターフェイスの場合と同様に、コンテンツ間のページ付けのリンクを設定したり、メタデータ(合計ページ数、サイズ、要素数など)を持たせるのに役立ちます。

ここでは簡単な例を示します。完全な例が提供されていますHERE

public class PagedResource<T> { 
    private List<T> content; 
    private final Map metadata; 
    public PagedResource(Page<T> page, String pageParam, String sizeParam, String sortParam, String sortField) { 
    super(); 
    this.setContent(page.getContent()); 
    this.metadata = new HashMap(); 
    List<Link> links = new ArrayList<Link>(); 
    if (page.hasPrevious()) { 
     String path = createBuilder().queryParam(pageParam, page.getNumber() - 1).queryParam(sizeParam, page.getSize()).queryParam(sortParam, sortField).build().toUriString(); 
     Link previousPageLink = new Link(path, Link.REL_PREVIOUS); 
     links.add(previousPageLink); 
    } 
    if (page.hasNext()) { 
     String path = createBuilder().queryParam(pageParam, page.getNumber() + 1).queryParam(sizeParam, page.getSize()).queryParam(sortParam, sortField).build().toUriString(); 
     Link nextPageLink = new Link(path, Link.REL_NEXT); 
     links.add(nextPageLink); 
    } 
    if (!page.isFirst()) { 
     Link firstPageLink = buildPageLink(pageParam, 0, sizeParam, page.getSize(), sortParam, sortField, Link.REL_FIRST); 
     links.add(firstPageLink); 
    } 
    if (!page.isLast()) { 
     int lastPage = page.getTotalPages() - 1; 
     Link lastPageLink = buildPageLink(pageParam, lastPage, sizeParam, page.getSize(), sortParam, sortField, Link.REL_LAST); 
     links.add(lastPageLink); 
    } 
    Link currentPagelink = buildPageLink(pageParam, page.getNumber(), sizeParam, page.getSize(), sortParam, sortField, Link.REL_SELF); 
    links.add(currentPagelink); 
    populateMetadata(page, links); 
    } 
    private void populateMetadata(Page<T> page, List<Link> links) { 
    int per_page = page.getSize(); 
    int totalPages = page.getTotalPages(); 
    int numberOfPageElements = page.getNumberOfElements(); 
    metadata.put("numberOfPageElements", numberOfPageElements); 
    metadata.put("perPage", per_page); 
    metadata.put("totalPages", totalPages); 
    metadata.put("links", links); 
    } 
    private Link buildPageLink(String pageParam, int page, String sizeParam, int size, String sortParam, String sortAttribute, String rel) { 
    String path = createBuilder().queryParam(pageParam, page).queryParam(sizeParam, size).queryParam(sortParam, sortAttribute).toUriString(); 
    Link link = new Link(path, rel); 
    return link; 
    } 
    private ServletUriComponentsBuilder createBuilder() { 
    return ServletUriComponentsBuilder.fromCurrentRequestUri(); 
    } 
    public List<T> getContent() { 
    return content; 
    } 
    public void setContent(List<T> content) { 
    this.content = content; 
    } 
    public Map getMetadata() { 
    return metadata; 
    } 
} 

希望します!

関連する問題