2015-11-06 163 views
5

我試圖從RepositoryRestResource添加一些額外的業務邏輯到自動生成的端點。請參閱下面的代碼:春季數據休息/春天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); 
    } 
} 

我看了以下兩個計算器文章:

我覺得我很近,但我現在面臨的問題是:

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。另一種方法是使用在創建,保存,刪除操作之前和/或之後調用的事件處理程序。

@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會爲你注入一個。

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); 
} 

您提供的告訴Spring如何將EventResourceResourceAssembler<Event>。 Spring將PagedResourcesAssembler<Event>注入到您的控制器方法中以處理分頁鏈接。通過調用toResource並傳入注入的pageAssembler來組合它們。

最終結果可以像上面那樣簡單地返回。你也可以使用諸如HttpEntity之類的東西來獲得對狀態碼和標題的更多控制。

注意:您提供的ResourceAssembler實際上可以像包裝資源(如Event)與Resource對象一樣簡單。通常你會想要添加任何相關的鏈接。

+0

感謝您的回覆。我想也許有可能從RepositoryRestResource註釋覆蓋自動生成的端點,而無需創建EventResource和EventResourceAssembler。認爲最好的解決方案可能是使用帶有RepositoryEventHandler批註的類並使用REST導出器發出的事件。這樣我就不必碰觸我的EventRepository,我可以將業務邏輯添加到這些端點。 – bmclachlin