2016-10-20 1 views
1

여기에서 묻는 질문과 똑같은 질문이 있습니다 (Exposing link on collection entity in spring data REST). 하지만이 주제의 어떤 것도 콜렉션 호출에 맞춤 링크를 추가하는 데 도움이되지 않습니다.스프링 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; 
    } 
} 

이 경우 프로세스 메서드가 호출되지 않습니다.

나는 _links 섹션에서 http://localhost:8080/event를 호출하고 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

나는 당신의 질문과 비슷한 상황에 처해있었습니다. 당신이 링크 한 질문/대답을 읽었을 때 그들 중 누구도 문제를 해결할 수 없다는 것을 알았습니다. 이 process 방법은 반환되는 자원의 관련 컬렉션의 각 자원에 대한 호출 된

@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; 
    } 
} 

: 여기 내 문제에 대한 궁극적 인 해답이었다. MyInterface 인터페이스와 MyClass 클래스는 최종 결과물로 대체해야하지만이 기능을 사용하려면 이렇게 작성해야합니다. process 메서드를 올바르게 호출하고 MyInterface 형식을 결정하는 데 사용한 단계는 다음과 같습니다.

  1. 나는 단순히 매개 변수로 ResourceSupport을 찍은 process 방법을 만들었습니다. 코드에 중단 점을 만들고 기본 클래스가 확장되어 있는지 검사했습니다. ResourceSupport. 제 경우에는 PersistentEntityResource이었습니다. 이는 Resource<MyClass> 또는 Resources<MyClass>을 사용하여 PersistentEntityResource 확장 Resource<Object>을 호출하지 않는 이유를 설명했습니다.

  2. process 메서드를 업데이트 할 때 매개 변수로 PersistentEntityResource을 사용합니다. 이로 인해 process 메서드가 의도 한 변경 사항 이상으로 호출되었습니다. 다시 한 번 중단 점을 사용하여 확장 된 에서 찾을 수있는 클래스를 알아 내려고 목적으로 PersistentEntityResource 개체를 검사했습니다. 나는 그것이 Proxy 클래스 였고 원하는대로 MyClass으로 캐스트 할 수 없다는 것을 발견했습니다.

  3. 클래스에 대한 자세한 내용을 보려면 여기를 클릭하십시오. https://stackoverflow.com/a/3344386/1417690. 디버깅하는 동안이 클래스를 정의하는 데 도움이되는 인터페이스 목록을 발견했습니다. 그 중 하나는 MyProjectionInterface 유형입니다. 이제는 을 사용할 수없는 이유는 실제로는 Resource<MyProjectionInterface> 이었기 때문입니다.

  4. 내가 처리해야하는 세 가지 Projections이 있습니다. 세 개의 별도의 ResourcePorcoessors을 만드는 대신 MyInterface을 만들고 내 projection 세 개의 인터페이스를 모두 확장했습니다. MyInterface에는 projections이 이미 지원되는 Long getId() 메서드 만 포함되어있었습니다.

  5. 나는 Resource<MyInterface>를 사용하려면 코드를 업데이트합니다 (projections의 모든 관련이 있음)와 getId() 방법은 내가 MyInterface에 정의했다 MyClass를 사용하여 linkForSingleResource을 추가했다. 이렇게하면 반환되는 각 리소스에 원하는 링크가 성공적으로 추가되었습니다.

는 희망이 단계는 다른 사람이 process 방법에 대한 매개 변수로 사용하는 유형을 결정하는 방법을 찾을 수 있도록 도와.

관련 문제