2016-09-26 14 views
2

コントローラとリポジトリの両方のメソッドへのHATEAOSリンクを結合したいと思います。同じエンティティ上のコントローラリンクとSpringデータのリンクをマージする

@RepositoryRestController 
@ResponseBody 
@ExposesResourceFor(Group.class) 
@RequestMapping(value = "/api/v2/groups", produces = MediaTypes.HAL_JSON_VALUE) 
public class GroupController { 

    @Resource 
    private GroupService groupService; 

    @RequestMapping(value = "/external", method = POST) 
    public @ResponseBody PersistentEntityResource saveExternalGroup(
      @RequestBody Group newGroup, 
      PersistentEntityResourceAssembler assembler) { 

     return assembler.toResource(groupService.saveExternalGroup(newGroup)); 

    } 

} 

リポジトリ:

@RepositoryRestResource(excerptProjection = GroupSummary.class) 
public interface GroupDao extends DefaultDao<Group, Long> { 

    @NotNull 
    List<Group> findByState(@Nullable GroupState state); 
...other methods... 

Iは、API/V2 /グループ/に移動しても/外部へのリンクが存在持っている可能性を持って実現したいと思います。現在、リポジトリからのリンクのみが返されます。

"_links": { 
    "first": { 
     "href": "http://localhost:8300/api/v2/groups?page=0&size=20" 
    }, 
    "self": { 
     "href": "http://localhost:8300/api/v2/groups" 
    }, 
    "next": { 
     "href": "http://localhost:8300/api/v2/groups?page=1&size=20" 
    }, 
    "last": { 
     "href": "http://localhost:8300/api/v2/groups?page=1&size=20" 
    }, 
    "profile": { 
     "href": "http://localhost:8300/api/v2/profile/groups" 
    }, 
    "search": { 
     "href": "http://localhost:8300/api/v2/groups/search" 
    } 
    }, 

私はそこにすべての上記に加えて、このようなものとして取得するために実装する必要があります。

"external": { 
      "href": "http://localhost:8300/api/v2/groups/external" 
     } 

か、その「/外部が」POSTであるとの問題があります?もしそうなら、 "method = GET"でコメントし、この質問を検討してください。

答えて

0

オプション1:それは一回限りだ場合

、あなたはResourceクラスを使用して、コントローラのメソッド内のリンクを追加することができます。

@RequestMapping(value = "/external", method = POST) 
public @ResponseBody PersistentEntityResource saveExternalGroup(
     @RequestBody Group newGroup, 
     PersistentEntityResourceAssembler assembler) { 

    PersistentEntityResource resource = assembler.toResource(groupService.saveExternalGroup(newGroup)); 

    // Replace with ControllerLinkBuilder call, or EntityLinks as you see fit. 
    resource.add(new Link("http://localhost:8300/api/v2/groups/external","search")); 

    return resource; 
} 

オプション2:

あなたはそれを追加するResourceProcessorコンポーネントを作成し、その後、すべてのレンダリングResource<Group>に追加するこのリンクをご希望の場合。

@Component 
public class GroupResourceProcessor implements ResourceProcessor<Resource<Group>> { 

    @Override 
    public Resource<Group> process(Resource<Group> groupResource) { 

     // Replace with ControllerLinkBuilder call, or EntityLinks as you see fit. 
     groupResource.add(new Link("http://localhost:8300/api/v2/groups/external","search")); 

     return groupResource; 
    } 

} 
+0

オプション1)このリンクは、メソッドの実行時に生成されます。私が達成したいのは、/グループに行くときに、すべてのDAOメソッドへのリンクとControllerへのすべてのリンクがあるということです。オプション2)プロセッサーを追加しましたが、決して呼び出されないようです。それから、私は投影を使用するときに問題があることを知りました(私はそうしています):http://stackoverflow.com/questions/33501648/excerpt-projection-and-custom-links-from-resourceprocessor – Cipous

+0

@Cipous Ok、オプション2。リンクされたその質問に対する添付されたJIRAの問題を見ると、あなたはこれを行うことができますが、 'ResourceProcessor >'またはあなたの投影が呼ばれたものを作成しなければなりません。そのロジックを実装します。あなたはまだそれを働かせることができるはずです。 –

+0

オプションは、それぞれのレコードに対して正しく投影されますが、 "ルート"レベルでは提供されません。私は、データベースにレコードがない場合は、 "...プロファイル/グループ"、 ".../groups/search"、 "self"を提供しています。そこに別のリンクを追加する方法はありますか? – Cipous

関連する問題