RepositoryRestResourceから自動生成されたエンドポイントに追加のビジネスロジックを追加しようとしています。以下のコードを参照してください。Springデータレスト/ Spring Hateoasカスタムコントローラ - PersistentEntityResourceAssembler
リソース:
@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);
}
}
私は、次の2つの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
私は近いだような気がしますが、私は直面しています問題は、次のとおりです。
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を持つこと。もう1つの方法は、作成、保存、削除操作の前および/または後に呼び出されるイベントハンドラを使用することです。
@RepositoryEventHandler(Event.class)
public class EventRepositoryEventHandler {
@HandleBeforeCreate
private void handleEventCreate(Event event) {
System.out.println("1");
}
}
findAllまたはfindOne操作のイベントはないようです。とにかく、これら両方のアプローチは、RepositoryRestResourceから自動生成コントローラメソッドを拡張するという私の問題を解決するようです。
http://stackoverflow.com/questions/21346387/how-to-correctly-use-pagedresourcesassembler-from-spring-dataより詳しい情報が提供される場合があります。 – Jason
@Jasonこのリンクをいただきありがとうございました。 – bmclachlin