gpt4 book ai didi

java - Spring Data Rest/Spring Hateoas 自定义 Controller - PersistentEntityResourceAssembler

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:58 24 4
gpt4 key购买 nike

我正在尝试向 RepositoryRestResource 自动生成的端点添加一些额外的业务逻辑。请看下面的代码:

资源:

@RepositoryRestResource(collectionResourceRel="event", path="event")
public interface EventRepository extends PagingAndSortingRepository<Event, Long> {

}

Controller :

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

我看过以下两篇 stackoverflow 文章:

我觉得我很接近,但我面临的问题是:

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 注释自动创建的 Controller 方法,而不必创建我自己的资源和资源组装器。创建资源和资源组装器后,我能够将我的业务逻辑添加到端点。

资源:

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

更新 Controller :

@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 扩展自动生成的 Controller 方法的问题。

最佳答案

它需要一个 PagedResourcesAssembler,如果你要求,Spring 会为你注入(inject)一个。

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

您提供 ResourceAssembler<Event>告诉 Spring 如何转换 Event进入 Resource . Spring注入(inject)PagedResourcesAssembler<Event>进入你的 Controller 方法来处理分页链接。通过调用 toResource 组合它们并传入注入(inject)的 pageAssembler .

最终结果可以像上面一样简单地作为主体返回。你也可以使用类似 HttpEntity 的东西以获得对状态代码和 header 的更多控制。

注意:ResourceAssembler您提供的字面上可以像包装资源一样简单,例如 Event , 与 Resource目的。不过,通常您会想要添加任何相关链接。

关于java - Spring Data Rest/Spring Hateoas 自定义 Controller - PersistentEntityResourceAssembler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33571920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com