Sto tentando di aggiungere qualche business logic aggiuntivo agli endpoint generati automaticamente da RepositoryRestResource. Si prega di consultare il codice qui sotto:Spring Data Rest/Spring Hateoas Custom Controller - PersistentEntityResourceAssembler
risorse:
@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);
}
}
Ho guardato i seguenti due articoli 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
Mi sento come se fossi vicino, ma il problema che sto affrontando è che:
return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler);
restituisce un errore che dice:
"The method toResource(Page<Event>, Link) in the type PagedResourcesAssembler<Event> is not applicable
for the arguments (Page<Event>, PersistentEntityResourceAssembler)".
Il metodo toResource ha una firma del metodo che accetta un ResourceAssembler, ma non sono sicuro di come implementarlo correttamente e non riesco a trovare alcuna documentazione in merito.
Grazie in anticipo, - Brian
Modifica
Il mio problema è che ho pensato che avrei potuto ignorare i metodi del controller che sono create automaticamente da @RepositoryRestResource
annotazioni senza dover creare la mia risorsa e assemblatore di risorse. Dopo aver creato l'assemblatore di risorse e risorse sono stato in grado di aggiungere la mia logica aziendale all'endpoint.
risorse:
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;
}
}
controller Aggiornato:
@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);
}
}
La cosa che non mi piace di questo è che sembra annullare l'obiettivo di avere una RepositoryRestResource. L'altro approccio sarebbe utilizzare i gestori di eventi che verrebbero richiamati prima e/o dopo le operazioni di creazione, salvataggio e cancellazione.
@RepositoryEventHandler(Event.class)
public class EventRepositoryEventHandler {
@HandleBeforeCreate
private void handleEventCreate(Event event) {
System.out.println("1");
}
}
Non sembrano esserci eventi per le operazioni findAll o findOne. Ad ogni modo, entrambi questi approcci sembrano risolvere il mio problema di estendere i metodi del controller generato automaticamente da RepositoryRestResource.
http://stackoverflow.com/questions/21346387/how-to-correctly-use-pagedresourcesassembler-from-spring-data potrebbe fornire ulteriori informazioni. – Jason
@Jason Grazie a questo link sicuramente mi ha aiutato nella giusta direzione. – bmclachlin