我試圖從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);
}
}
我看了以下兩個計算器文章:
- Can I make a custom controller mirror the formatting of Spring-Data-Rest/Spring-Hateoas generated classes?
- Enable HAL serialization in Spring Boot for custom controller method
我覺得我很近,但我現在面臨的問題是:
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擴展自動生成的控制器方法的問題。
http://stackoverflow.com/questions/21346387/how-to-correctly-use-pagedresourcesassembler-from-spring-data可能會提供更多信息。 – Jason
@Jason感謝這個鏈接絕對幫助我邁向正確的方向。 – bmclachlin