2016-10-20 4 views
1

У меня есть тот же вопрос, который задан здесь (Exposing link on collection entity in spring data REST). Но ничто из этой темы не помогает мне добавить пользовательскую ссылку для вызова коллекции.Воздействие ссылки на объект сбора с использованием spring hateoas

@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 и получить следующий JSON с my_custom_link под _links разделе:

{ 
 
    "_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. Я создал метод process, который просто взял ResourceSupport в качестве параметра. Я создал контрольную точку в коде и проверил, какой базовый класс расширяется ResourceSupport. В моем случае это было PersistentEntityResource. Это объясняет, почему использование Resource<MyClass> или Resources<MyClass> никогда не вызывало метод process: PersistentEntityResource расширяет Resource<Object>.

  2. Я обновил process метод принимает PersistentEntityResource в качестве параметра. Это привело к тому, что метод process вызывался больше, чем предполагаемые изменения. Я снова использовал контрольную точку для проверки объекта PersistentEntityResource с целью обнаружения того, какой класс можно найти в Resource<Object>, который он расширил. Я обнаружил, что это класс Proxy, и его нельзя было отличить до MyClass, как я и хотел.

  3. Я нашел ответ, найденный здесь, чтобы узнать больше о Proxy класс: https://stackoverflow.com/a/3344386/1417690. Во время отладки я обнаружил список интерфейсов, которые помогли определить этот класс. Один из них был типа MyProjectionInterface. Я теперь знал, что причина, по которой я не мог использовать Resource<Portal>, была потому, что она была фактически Resource<MyProjectionInterface>.

  4. У меня было три разных Projections, с которыми мне нужно было обращаться. Вместо создания трех отдельных ResourcePorcoessors я создал MyInterface и имел все три моих интерфейса projection. MyInterface содержал только метод Long getId(), который все поддерживал все projections.

  5. Я обновил свой код, чтобы использовать Resource<MyInterface> и добавил linkForSingleResource с помощью MyClass (что все projections относятся к) и метод getId() я определил в MyInterface. Это успешно добавило желаемую ссылку на каждый возвращаемый ресурс.

Надеемся, что эти шаги помогут другим людям узнать, как определить, какой тип использовать в качестве параметра для метода process.

 Смежные вопросы

  • Нет связанных вопросов^_^