2016-10-20 5 views
1

私はここで質問されたのと同じ質問をしています(Exposing link on collection entity in spring data REST)。しかし、このトピックの何も私はコレクションコールにカスタムリンクを追加するのに役立ちません。春の嫌悪感を使ってコレクションエンティティにリンクを公開する

@Component 
public class EventListResourceProcessor implements ResourceProcessor<Resources<Event>> { 

    @Autowired 
    private RepositoryEntityLinks entityLinks; 

    @Override 
    public Resources<Event> process(Resources<Event> events) { 
     events.add(entityLinks.linkToCollectionResource(Event.class).withRel("events")); 
     return events; 
    } 
} 

この場合、プロセスメソッドは呼び出されません。私はhttp://localhost:8080/eventを呼び出し、_linksセクションの下my_custom_linkと、次のJSONを取得する必要があり

{ 
 
    "_embedded": { 
 
    "event": [ 
 
     { 
 
     "id": "1", 
 
     "name": "Updated event" 
 
     }] 
 
    }, 
 
    "_links": { 
 
    "self": { 
 
     "href": "http://localhost:8080/event" 
 
    }, 
 
    "profile": { 
 
     "href": "http://localhost:8080/profile/event" 
 
    }, 
 
    "my_custom_link": { 
 
     "href": "http://localhost:8080/custom/" 
 
    } 
 
    }, 
 
    "page": { 
 
    "size": 20, 
 
    "totalElements": 4, 
 
    "totalPages": 1, 
 
    "number": 0 
 
    } 
 
} 
 

 
}

あなたは私に助言していただけますか?

ありがとうございます!

答えて

1

私はあなたの質問と同様の状況にありました。あなたがリンクした質問/回答を読んでいたので、誰も問題を解決できなかったことがわかりました。ここに私の問題への最終的な答えだった:

@Component 
public class MyResourceProcessor implements ResourceProcessor<Resource<MyInterface>> { 

    @Autowired 
    private EntityLinks entityLinks; 

    @Override 
    public Resource<MyInterface> process(Resource<MyInterface> event) { 
     event.add(entityLinks.linkForSingleResource(MyClass.class, event.getContent().getId()).slash("custom").withRel("custom")); 
     return event; 
    } 
} 

このprocessメソッドが返されるリソースの関連するコレクション内の各リソースのために呼ばれていました。 MyInterfaceのインターフェースとMyClassのクラスは、必要とするものに置き換えてください。しかし、これを動作させるには、そのように書く必要があります。 processメソッドが正常に呼び出され、MyInterfaceの型を決定するために使用した手順を次に示します。

  1. 私は単純にパラメータとしてResourceSupportを取っprocess方法を作成しました。私はコード内にブレークポイントを作成し、どの基礎クラスが拡張されているかを調べましたResourceSupport。私の場合、それはPersistentEntityResourceでした。これにより、Resource<MyClass>またはResources<MyClass>を使用しても、PersistentEntityResourceResource<Object>になることはありません。

  2. processメソッドをパラメータとしてPersistentEntityResourceと更新しました。これにより、processメソッドが意図した変更を超えて呼び出されました。私はもう一度ブレークポイントを使用して、オブジェクトを検査し、拡張されたで見つかったクラスを発見しました。私はそれがProxyクラスであることを発見し、希望通りにMyClassにキャストできませんでした。

  3. クラスの詳細については、こちらをご覧ください。https://stackoverflow.com/a/3344386/1417690デバッグ中に、私はこのクラスを定義するのに役立つインターフェイスのリストを発見しました。そのうちの1つはタイプMyProjectionInterfaceでした。私は今実際にはResource<MyProjectionInterface>だったので、Resource<Portal>を使用できなかった理由が分かっていました。

  4. 私は扱う必要があった3種類のProjectionsを持っていました。 3つの別々のResourcePorcoessorsを作成する代わりに、私はMyInterfaceを作成し、私のprojectionインターフェイスの3つすべてがそれを拡張しました。 MyInterfaceには、すでにサポートされているprojectionsLong getId()メソッドのみが含まれていました。

  5. 私はResource<MyInterface>を使用するために自分のコードを更新し、MyClassprojectionsのすべてがに関連すること)と私はMyInterfaceで定義されていたgetId()方法を使用してlinkForSingleResourceを追加しました。これにより、返される各リソースに必要なリンクが正常に追加されました。

うまくいけば、これらの手順は、他の人がprocessメソッドのパラメータとして使用する種類を決定する方法を発見するのに役立ちます。

関連する問題