2015-11-06 166 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