Ich versuche, den auto-generierten Endpunkten aus der RepositoryRestResource zusätzliche Geschäftslogik hinzuzufügen. Bitte beachten Sie den Code unten:Spring Data Rest/Frühjahr Hateoas Custom Controller - PersistentEntityResourceAssembler
Ressource:
@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);
}
}
Ich habe auf den beiden folgenden Artikel angesehen Stackoverflow:
- Can I make a custom controller mirror the formatting of Spring-Data-Rest/Spring-Hateoas generated classes?
- Enable HAL serialization in Spring Boot for custom controller method
Ich fühle mich wie ich in der Nähe bin, aber das Problem, dass ich mit Blick auf bin ist, dass:
return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler);
einen Fehler zurückgibt sagen:
"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 Methode Signatur, akzeptiert einen ResourceAssembler, aber ich bin nicht sicher, wie man das richtig umsetzt und ich kann keine Dokumentation zu diesem Thema finden.
Vielen Dank im Voraus, - Brian
bearbeiten
Mein Problem war, dass ich dachte, ich könnte die Controller-Methoden überschreibt, die meine eigene Ressource, ohne von @RepositoryRestResource
Annotation automatisch erstellt werden erstellen und Ressourcenassembler. Nach dem Erstellen des Ressourcen- und Ressourcen-Assemblers konnte ich dem Endpunkt meine Geschäftslogik hinzufügen.
Ressource:
public class EventResource extends ResourceSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Ressource-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;
}
}
Aktualisiert 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 ich darüber nicht mag, ist, dass es um den Zweck zu besiegen scheint eine RepositoryRestResource haben. Der andere Ansatz wäre, Event-Handler zu verwenden, die vor und/oder nach den Operationen zum Erstellen, Speichern und Löschen 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.
http://stackoverflow.com/questions/21346387/how-to-correctly-use-pagedresourcesassembler-from-spring-data kann weitere Informationen bereitstellen. – Jason
@Jason Dank dieser Verbindung half mir definitiv in die richtige Richtung. – bmclachlin