Я был в аналогичной ситуации с вашим вопросом: я прочитал вопрос/ответы, которые вы связали, и обнаружил, что ни один из них не может решить проблему. Здесь был окончательный ответ на мою проблему:
@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
.
Я создал метод process
, который просто взял ResourceSupport
в качестве параметра. Я создал контрольную точку в коде и проверил, какой базовый класс расширяется ResourceSupport
. В моем случае это было PersistentEntityResource
. Это объясняет, почему использование Resource<MyClass>
или Resources<MyClass>
никогда не вызывало метод process
: PersistentEntityResource
расширяет Resource<Object>
.
Я обновил process
метод принимает PersistentEntityResource
в качестве параметра. Это привело к тому, что метод process
вызывался больше, чем предполагаемые изменения. Я снова использовал контрольную точку для проверки объекта PersistentEntityResource
с целью обнаружения того, какой класс можно найти в Resource<Object>
, который он расширил. Я обнаружил, что это класс Proxy
, и его нельзя было отличить до MyClass
, как я и хотел.
Я нашел ответ, найденный здесь, чтобы узнать больше о Proxy
класс: https://stackoverflow.com/a/3344386/1417690. Во время отладки я обнаружил список интерфейсов, которые помогли определить этот класс. Один из них был типа MyProjectionInterface
. Я теперь знал, что причина, по которой я не мог использовать Resource<Portal>
, была потому, что она была фактически Resource<MyProjectionInterface>
.
У меня было три разных Projections
, с которыми мне нужно было обращаться. Вместо создания трех отдельных ResourcePorcoessors
я создал MyInterface
и имел все три моих интерфейса projection
. MyInterface
содержал только метод Long getId()
, который все поддерживал все projections
.
Я обновил свой код, чтобы использовать Resource<MyInterface>
и добавил linkForSingleResource
с помощью MyClass
(что все projections
относятся к) и метод getId()
я определил в MyInterface
. Это успешно добавило желаемую ссылку на каждый возвращаемый ресурс.
Надеемся, что эти шаги помогут другим людям узнать, как определить, какой тип использовать в качестве параметра для метода process
.