Spring Data Rest / Spring Hateoas Пользовательский контроллер - PersistentEntityResourceAssembler
Я пытаюсь добавить некоторую дополнительную бизнес-логику к автоматически генерируемым конечным точкам из RepositoryRestResource. Пожалуйста, смотрите код ниже:
Ресурс:
@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);
}
}
Я посмотрел на следующие две статьи stackoverflow:
Могу ли я заставить собственный контроллер отражать форматирование сгенерированных классов Spring-Data-Rest / Spring-Hateoas?Включите сериализацию HAL в Spring Boot для пользовательского метода контроллераЯ чувствую, что я рядом, но проблема, с которой я сталкиваюсь, заключается в следующем:
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.