bmc*_*lin 6 java spring spring-mvc spring-data-rest spring-hateoas
我正在尝试从RepositoryRestResource向自动生成的端点添加一些额外的业务逻辑.请参阅以下代码:
资源:
@RepositoryRestResource(collectionResourceRel="event", path="event")
public interface EventRepository extends PagingAndSortingRepository<Event, Long> {
}
Run Code Online (Sandbox Code Playgroud)
控制器:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了以下两篇stackoverflow文章:
我觉得我很亲密,但我面临的问题是:
return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler);
Run Code Online (Sandbox Code Playgroud)
返回错误说:
"The method toResource(Page<Event>, Link) in the type PagedResourcesAssembler<Event> is not applicable
for the arguments (Page<Event>, PersistentEntityResourceAssembler)".
Run Code Online (Sandbox Code Playgroud)
toResource方法有一个接受ResourceAssembler的方法签名,但我不知道如何正确实现它,我找不到任何关于此事的文档.
在此先感谢, - 布赖恩
编辑
我的问题是我认为我可以覆盖从@RepositoryRestResource
注释自动创建的控制器方法,而无需创建自己的资源和资源汇编程序.创建资源和资源汇编程序后,我能够将业务逻辑添加到端点.
资源:
public class EventResource extends ResourceSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
资源汇编程序:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
更新控制器:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢的事情是它似乎打败了拥有RepositoryRestResource的目的.另一种方法是使用在创建,保存,删除操作之前和/或之后调用的事件处理程序.
@RepositoryEventHandler(Event.class)
public class EventRepositoryEventHandler {
@HandleBeforeCreate
private void handleEventCreate(Event event) {
System.out.println("1");
}
}
Run Code Online (Sandbox Code Playgroud)
findAll或findOne操作似乎没有任何事件.无论如何,这两种方法似乎都解决了我从RepositoryRestResource扩展自动生成的控制器方法的问题.
小智 1
它需要一个 PagedResourcesAssembler,如果你要求,Spring 会为你注入一个。
public PagedResources<Foo> get(Pageable page, PagedResourcesAssembler<Foo> assembler) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
在本例中,资源是Foo
. 在您的情况下,您尝试返回的资源似乎是Event
. 如果是这样,我希望你的代码看起来像这样:
private ResourceAssembler<Event> eventAssembler = ...;
public PagedResources<Event> get(Pageable page, PagedResourcesAssembler<Event> pageAssembler) {
Event event = ...;
return eventAssembler.toResource(event, pageAssembler);
}
Run Code Online (Sandbox Code Playgroud)
您提供ResourceAssembler<Event>
告诉 Spring 如何转变Event
成Resource
. Spring 将 注入PagedResourcesAssembler<Event>
到您的控制器方法中来处理分页链接。toResource
通过调用并传入注入的内容来组合它们pageAssembler
.
最终结果可以简单地作为上面的正文返回。你也可以使用类似的东西HttpEntity
获得对状态代码和标头的更多控制之类的东西。
注意:ResourceAssembler
您提供的实际上可以是简单的东西,例如Event
用Resource
对象包装资源(例如 )。一般来说,您会想要添加任何相关链接。
归档时间: |
|
查看次数: |
4999 次 |
最近记录: |