Spring Data Rest / Spring Hateoas Benutzerdefinierter Controller - PersistentEntityResourceAssembler

Ich versuche, den automatisch generierten Endpunkten aus RepositoryRestResource eine zusätzliche Geschäftslogik hinzuzufügen. Bitte beachten Sie den folgenden Code:

Ressource

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

}

Regler

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

Ich habe mir die folgenden zwei Stackoverflow-Artikel angesehen:

Kann ich einen benutzerdefinierten Controller so konfigurieren, dass er die Formatierung der von Spring-Data-Rest / Spring-Hateoas generierten Klassen spiegelt?HAL-Serialisierung in Spring Boot für benutzerdefinierte Controller-Methode aktivieren

Ich habe das Gefühl, dass ich nah dran bin, aber das Problem, vor dem ich stehe, ist das folgende:

return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler);

gibt einen Fehler zurück, der besagt:

"The method toResource(Page<Event>, Link) in the type PagedResourcesAssembler<Event> is not applicable 
 for the arguments (Page<Event>, PersistentEntityResourceAssembler)".

Die toResource-Methode hat eine Methodensignatur, die einen ResourceAssembler akzeptiert, aber ich bin nicht sicher, wie ich das richtig implementieren soll, und ich kann keine Dokumentation zu diesem Thema finden.

ielen Dank im Voraus, - Brian

Bearbeite

Mein Problem war, dass ich dachte, ich könnte die Controller-Methoden überschreiben, die automatisch von @ erstellt werd@RepositoryRestResource Annotation, ohne meine eigene Ressource und meinen eigenen Ressourcenassembler erstellen zu müssen. Nach dem Erstellen der Ressource und des Ressourcenassemblers konnte ich meine Geschäftslogik zum Endpunkt hinzufügen.

Ressource

public class EventResource extends ResourceSupport {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Resource Assembler:

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

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

Das, was mir nicht gefällt, ist, dass es den Zweck einer RepositoryRestResource zu besiegen scheint. Der andere Ansatz wäre die Verwendung von Ereignishandlern, die vor und / oder nach dem Erstellen, Speichern und Löschen von Vorgängen aufgerufen werden.

@RepositoryEventHandler(Event.class)
public class EventRepositoryEventHandler {

  @HandleBeforeCreate
  private void handleEventCreate(Event event) {
    System.out.println("1");
  }
}

Es scheint keine Ereignisse für die Operationen findAll oder findOne zu geben. Wie auch immer, beide Ansätze scheinen mein Problem zu lösen, die automatisch generierten Controller-Methoden von RepositoryRestResource zu erweitern.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage