Java Spring数据Rest/Spring Hateoas自定义控制器-PersistentEntityResourcesAssembler
我试图向RepositoryRestResource中自动生成的端点添加一些额外的业务逻辑。请参阅下面的代码: 资源:Java Spring数据Rest/Spring Hateoas自定义控制器-PersistentEntityResourcesAssembler,java,spring,spring-mvc,spring-data-rest,spring-hateoas,Java,Spring,Spring Mvc,Spring Data Rest,Spring Hateoas,我试图向RepositoryRestResource中自动生成的端点添加一些额外的业务逻辑。请参阅下面的代码: 资源: @RepositoryRestResource(collectionResourceRel="event", path="event") public interface EventRepository extends PagingAndSortingRepository<Event, Long> { } public class EventResource e
@RepositoryRestResource(collectionResourceRel="event", path="event")
public interface EventRepository extends PagingAndSortingRepository<Event, Long> {
}
public class EventResource extends ResourceSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
返回一个错误,说明:
"The method toResource(Page<Event>, Link) in the type PagedResourcesAssembler<Event> is not applicable
for the arguments (Page<Event>, PersistentEntityResourceAssembler)".
资源汇编程序:
@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;
}
}
findAll或findOne操作似乎没有任何事件。无论如何,这两种方法似乎都解决了我从RepositoryRestResource扩展自动生成的控制器方法的问题。它需要一个PagedResourcesAssembler,如果你要求,Spring会为你注入一个
public PagedResources<Foo> get(Pageable page, PagedResourcesAssembler<Foo> assembler) {
// ...
}
您提供了ResourceAssembler
,它告诉Spring如何将事件
转换为资源
。Spring将PagedResourcesAssembler
注入控制器方法以处理分页链接。通过调用toResource
并传入插入的pageAssembler
来组合它们
最终结果可以像上面那样简单地作为一个主体返回。您还可以使用诸如HttpEntity
之类的工具来获得对状态代码和标题的更多控制
注意:您提供的
resourcesassembler
可以简单地包装资源,例如Event
,使用resource
对象。一般来说,您需要添加任何相关链接。要破解它,您只需使用PagedResourcesSembler
即可:
@RequestMapping(method = RequestMethod.GET, value = "")
@ResponseBody
public PagedModel<PersistentEntityResource> getEvents(
Pageable pageable,
PersistentEntityResourceAssembler persistentAssembler,
PagedResourcesAssembler<Object> pageableAssembler
) {
return pageableAssembler.toModel(
(Page<Object>) repository.findAll(pageable),
persistentAssembler
);
}
@RequestMapping(method=RequestMethod.GET,value=”“)
@应答器
公共页面模型getEvents(
可分页可分页,
PersistentEntityResourcesAssembler persistentAssembler,
PagedResourcesAssembler pageableAssembler
) {
返回pageableAssembler.toModel(
(第页)repository.findAll(可分页),
持久装配器
);
}
可能会提供更多信息。@Jason感谢此链接确实帮助我找到了正确的方向。感谢您的回复。我认为也许可以从RepositoryRestResource注释重写自动生成的端点,而不必创建EventResource和EventResourceAssembler。我认为最好的解决方案可能是使用带有RepositoryEventHandler注释的类,并使用REST导出器发出的事件。这样我就不必接触我的EventRepository,我可以将我的业务逻辑添加到这些端点。
@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);
}
}
@RepositoryEventHandler(Event.class)
public class EventRepositoryEventHandler {
@HandleBeforeCreate
private void handleEventCreate(Event event) {
System.out.println("1");
}
}
public PagedResources<Foo> get(Pageable page, PagedResourcesAssembler<Foo> assembler) {
// ...
}
private ResourceAssembler<Event> eventAssembler = ...;
public PagedResources<Event> get(Pageable page, PagedResourcesAssembler<Event> pageAssembler) {
Event event = ...;
return eventAssembler.toResource(event, pageAssembler);
}
@RequestMapping(method = RequestMethod.GET, value = "")
@ResponseBody
public PagedModel<PersistentEntityResource> getEvents(
Pageable pageable,
PersistentEntityResourceAssembler persistentAssembler,
PagedResourcesAssembler<Object> pageableAssembler
) {
return pageableAssembler.toModel(
(Page<Object>) repository.findAll(pageable),
persistentAssembler
);
}