2015-11-06 15 views
5

RepositoryRestResourceから自動生成されたエンドポイントに追加のビジネスロジックを追加しようとしています。以下のコードを参照してください。Springデータレスト/ Spring Hateoasカスタムコントローラ - PersistentEntityResourceAssembler

リソース:

@RepositoryRestResource(collectionResourceRel="event", path="event") 
public interface EventRepository extends PagingAndSortingRepository<Event, Long> { 

} 

コントローラー:

@RepositoryRestController 
@RequestMapping(value = "/event") 
public class EventController { 

    @Autowired 
    private EventRepository eventRepository; 

    @Autowired 
    private PagedResourcesAssembler<Event> pagedResourcesAssembler; 

    @RequestMapping(method = RequestMethod.GET, value = "") 
    @ResponseBody 
    public PagedResources<PersistentEntityResource> getEvents(Pageable pageable, 
     PersistentEntityResourceAssembler persistentEntityResourceAssembler) { 

    Page<Event> events = eventRepository.findAll(pageable); 

    return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler); 
    } 
} 

私は、次の2つのstackoverflowの記事を見てきました:

私は近いだような気がしますが、私は直面しています問題は、次のとおりです。

return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler); 

はというエラーを返します。

"The method toResource(Page<Event>, Link) in the type PagedResourcesAssembler<Event> is not applicable 
for the arguments (Page<Event>, PersistentEntityResourceAssembler)". 

toResourceメソッドは、メソッドのシグネチャを持っていますResourceAssemblerを受け取りますが、これを正しく実装する方法がわかりませんし、その問題に関するドキュメントが見つかりません。事前に

おかげで、 - ブライアン

編集

は私の問題は、私は私が自分自身のリソースを作成しなくても、@RepositoryRestResourceのアノテーションから自動作成され、コントローラのメソッドをオーバーライドすると考えていたということでしたし、リソースアセンブラ。リソースとリソース・アセンブラを作成した後、ビジネス・ロジックをエンドポイントに追加できました。

リソース:

public class EventResource extends ResourceSupport { 
    private String name; 

    public String getName() { 
    return name; 
    } 

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

資源アセンブラ:

@Component 
public class EventResourceAssembler extends ResourceAssemblerSupport<Event, EventResource> { 

    public EventResourceAssembler() { 
    super(EventController.class, EventResource.class); 
    } 

    @Override 
    public EventResource toResource(Event entity) { 
    EventResource eventResource = createResourceWithId(entity.getId(), entity); 
    eventResource.setName(entity.getName()); 
    return eventResource; 
    } 
} 

更新コントローラー:

@RepositoryRestController 
@RequestMapping(value = "/event") 
public class EventController { 

    @Autowired 
    private EventRepository eventRepository; 

    @Autowired 
    private EventResourceAssembler eventResourceAssembler; 

    @Autowired 
    private PagedResourcesAssembler<Event> pageAssembler; 

    @RequestMapping(method = RequestMethod.GET, value = "") 
    @ResponseBody 
    public PagedResources<EventResource> getEvents(Pageable pageable) { 
    Page<Event> events = eventRepository.findAll(pageable); 

    // business logic 

    return pageAssembler.toResource(events, eventResourceAssembler); 
    } 
} 

私はこれについて好きではないことは、目的を倒すように見えるということですRepositoryRestResourceを持つこと。もう1つの方法は、作成、保存、削除操作の前および/または後に呼び出されるイベントハンドラを使用することです。

@RepositoryEventHandler(Event.class) 
public class EventRepositoryEventHandler { 

    @HandleBeforeCreate 
    private void handleEventCreate(Event event) { 
    System.out.println("1"); 
    } 
} 

findAllまたはfindOne操作のイベントはないようです。とにかく、これら両方のアプローチは、RepositoryRestResourceから自動生成コントローラメソッドを拡張するという私の問題を解決するようです。

+1

http://stackoverflow.com/questions/21346387/how-to-correctly-use-pagedresourcesassembler-from-spring-dataより詳しい情報が提供される場合があります。 – Jason

+0

@Jasonこのリンクをいただきありがとうございました。 – bmclachlin

答えて

1

PagedResourcesAssemblerが必要です。頼んだら、Springはあなたのために1つを注入します。

public PagedResources<Foo> get(Pageable page, PagedResourcesAssembler<Foo> assembler) { 
    // ... 
} 

この場合、リソースはFooです。あなたの場合、あなたが返そうとしているリソースはEventです。それがそうなら、私はあなたのコードのようなものに見えることを期待する:

private ResourceAssembler<Event> eventAssembler = ...; 
public PagedResources<Event> get(Pageable page, PagedResourcesAssembler<Event> pageAssembler) { 
    Event event = ...; 
    return eventAssembler.toResource(event, pageAssembler); 
} 

をあなたはResourceEventを有効にする方法春を告げるResourceAssembler<Event>を提供しています。 SpringはコントローラメソッドにPagedResourcesAssembler<Event>を挿入し、ページネーションリンクを処理します。 toResourceを呼び出し、注入されたpageAssemblerを渡してそれらを組み合わせる。

最終結果は、単に上記のようにボディとして返すことができます。 HttpEntityのようなものを使用して、ステータスコードとヘッダーをより詳細に制御することもできます。

注:あなたが提供するResourceAssemblerは、Eventのようなリソースを文字通り簡単なものにすることができ、Resourceオブジェクトです。一般的には関連するリンクを追加したいと思うでしょう。

+0

お返事ありがとうございます。私は、EventResourceとEventResourceAssemblerを作成することなく、RepositoryRestResourceアノテーションから自動生成されたエンドポイントをオーバーライドすることが可能かもしれないと考えました。 RepositoryEventHandlerアノテーションを持つクラスを使用し、RESTエクスポータが発行するイベントを使用するのが最善の解決策であると考えてください。こうすることで、EventRepositoryに触れる必要がなくなり、ビジネスロジックをこれらのエンドポイントに追加できます。 – bmclachlin

関連する問題