2016-12-01 9 views
4

私はいくつかのコントローラでエンドポイントを自動的に作成しています(REST)。カスタムレスポンスでSpringのRESTレスポンスが異なります

@RepositoryRestResource(collectionResourceRel = "books", path = "books") 
public interface BooksRepository extends CrudRepository<Books, Integer> { 
    public Page<Books> findTopByNameOrderByFilenameDesc(String name); 
} 

私が訪問:http://localhost:8080/Books

私は戻って取得:

{ 
    "_embedded": { 
     "Books": [{ 
      "id": , 
      "filename": "Test123", 
      "name": "test123", 
      "_links": { 
       "self": { 
        "href": "http://localhost:8080/books/123" 
       }, 
       "Books": { 
        "href": "http://localhost:8080/books/123" 
       } 
      } 
     }] 
    }, 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/books" 
     }, 
     "profile": { 
      "href": "http://localhost:8080/profile/books" 
     }, 
     "search": { 
      "href": "http://localhost:8080/books/search" 
     }, 
     "page": { 
      "size": 20, 
      "totalElements": 81, 
      "totalPages": 5, 
      "number": 0 
     } 
    } 
} 

私は自分のコントローラを作成する場合:

@Controller 
@RequestMapping(value = "/CustomBooks") 
public class CustomBooksController { 
    @Autowired 
    public CustomBookService customBookService; 

    @RequestMapping("/search") 
    @ResponseBody 
    public Page<Book> search(@RequestParam(value = "q", required = false) String query, 
           @PageableDefault(page = 0, size = 20) Pageable pageable) { 
     return customBookService.findAll(); 
    } 
} 

に見えることを、私は応答が返されます自動的に生成されたコントローラ応答のようなものはありません:

{ 
    "content": [{ 
     "filename": "Test123", 
     "name" : "test123" 
    }], 
    "totalPages": 5, 
    "totalElements": 81, 
    "size": 20, 
    "number": 0, 
} 

私の応答を自動的に生成された応答のように見えるようにするには、何が必要ですか?私は一貫性を保ちたいので、別の応答のためにコードを書き直す必要はありません。私はそれを別のやり方ですべきか?


編集:は、この発見: Enable HAL serialization in Spring Boot for custom controller method

をしかし、私は、私は有効にするために私のRESTコントローラーに変更する必要があるか理解していない:PersistentEntityResourceAssembler。私はGoogleでPersistentEntityResourceAssemblerを検索しましたが、多くの例がなくても、同様のページに戻ることができます(またはその例は私にとってはうまくいきません)。

+1

あなたは' @ResourceRestContro ller'? – chrylis

+0

あなたの質問を正しく理解しているかどうかわかりませんが、あなたが探しているものはHATEOASです。https://spring.io/guides/gs/rest-hateoas/ – Markus

+0

もう一度ページを返します。私はそれがタイプミスだと思いますか? –

答えて

5

@christisは、注釈を@RepositoryRestControllerに置き換えてspring-data-restを指定して、指定されたリソースをカスタマイズするためのResourceProcessorsを呼び出すようにしてください。あなたのメソッド宣言の戻り値の型がPagedResourcesにあなたのページのオブジェクトを変換するためのHttpEntity<PagedResources<Resource<Books>>> ようにする必要があります(あなたの春データレストBooksRepositoryのような)HATEOASの仕様に従うことを、リソースの

  • あなたがする必要がありますこのオブジェクトをautowireします。

    @Autowired private PagedResourcesAssembler<Books> bookAssembler;

  • あなたのreturn文は、これらの変更は、"_embedded""_linksを含むorg.springframework.hateoas.Resources準拠した応答を得るためにあなたを助けるべき

    return new ResponseEntity<>(bookAssembler.toResource(customBookService.findAll()), HttpStatus.OK);

ようにする必要があります"属性。

+0

参照のためにこの応答を使用することができます[link] http://stackoverflow.com/questions/31758862/enable-hal-serialization-in-spring-boot-for-custom-controller-method?noredirect=1&lq=1 –

+0

あなたは "@RestController"を意味しますか?私は "@ ResourceRestController"がオンラインのどこにも見当たりません。 "@Autowired"プライベートPagedResourcesAssembler を追加すると、intelliJはautowireできないという不満を表明します。コンパイルされ、springbootが起動します。しかし、私のコントローラを呼び出すと、 "予期しないエラーが発生しました(タイプ=内部サーバーエラー、ステータス= 500)。[PagedResource {content:[Resource {content:....]このエラーページはJSONではなくXML形式です。それは私がSolrからこれを引っ張っているかどうかは関係ありませんか?本は私のモデルです。 –

+0

上記の機能を使用するには、CustomBooksControllerがBooksRepositoryクラスと同じプロジェクトに存在する必要があります。 –

関連する問題