2017-05-10 6 views
5

을 처리하기 :잭슨 모듈은 <code>Criterion</code> 반면</p> <pre><code>public interface CriterionRepository extends JpaRepository<Criterion, Long> { } </code></pre> <p>는 기본 클래스입니다 내가 저장소와 봄 데이터 REST를 기반 응용 프로그램이 추상적 집계 루트와 봄 데이터의 서브 클래스 REST

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class Criterion extends AbstractEntity {} 

NameCriterion는 그 서브 클래스

@Entity 
public class NameCriterion extends Criterion { 
    private final String name; 
} 

스프링 데이터 REST는 t 그는 REST 자원으로 리포지토리 하나는 http://localhost:8080/api/criteria/에 액세스 할 수

다음과 같이

수출 자원 같습니다

{ 
    "_embedded": { 
     "nameCriteria": [{ 
       "_links": { 
        "self": { 
         "href": "http://localhost:8080/api/nameCriterion/1" 
        }, 
        "nameCriterion": { 
         "href": "http://localhost:8080/api/nameCriterion/1" 
        } 
       } 
      } 
     ] 
    }, 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/api/criteria" 
     }, 
     "profile": { 
      "href": "http://localhost:8080/api/profile/criteria" 
     } 
    }, 
    "page": { 
     "size": 20, 
     "totalElements": 1, 
     "totalPages": 1, 
     "number": 0 
    } 
} 

내가 자기 링크를 따라갈, http://localhost:8080/api/nameCriterion/1

의 매핑이없는 나는 따를 수 있습니다 http://localhost:8080/api/criteria/1하지만 내가 얻을 NameCriterion

{ 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/api/nameCriterion/1" 
     }, 
     "nameCriterion": { 
      "href": "http://localhost:8080/api/nameCriterion/1" 
     } 
    } 
} 
0에서 이름 필드없이 응답

집계 루트로 JpaRepository에 사용 된 추상 클래스 Criterion을 처리하기 위해 올바르게 조정되지 않은 REST 내보내기 프로그램에 정의 된 Jackson 매퍼에 문제가 있다고 가정합니다.

올바르게 작동시키기 위해 적용해야하는 Jackson 정의는 무엇입니까?

다른 말로하면 Jackson 모듈은 무엇을 만들어야합니까?

+0

내 대답이 도움이 되었다면 그것을 수락하는 것을 잊지 마십시오!) – Cepr0

답변

3

Jackson 모듈을 만들 필요가 없습니다. 상속 실체에 대해 하나의 테이블을 사용하려면 우리는 같은 자원으로 그들을 표시 @RestResource 주석을 사용할 수 있습니다

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table(name = "criteria") 
public abstract class Criterion extends AbstractEntity { 
} 

@RestResource(rel = "criteria", path = "criteria") 
@Entity 
public class NameCriterion extends Criterion { 

    private String name; 
} 

@RestResource(rel = "criteria", path = "criteria") 
@Entity 
public class TitleCriterion extends Criterion { 

    private String title; 
} 

@RepositoryRestResource(path = "criteria", collectionResourceRel = "criteria", itemResourceRel = "criterion") 
public interface CriterionRepository extends JpaRepository<Criterion, Long> { 
} 

을 그래서 하나 개의 출력에 모든 자원 (NameCriterion 및 TitleCriterion)을 얻을 수있다 :

GET http://localhost:8080/api/criteria 

{ 
    "_embedded": { 
    "criteria": [ 
     { 
     "name": "name1", 
     "_links": { 
      "self": { 
      "href": "http://localhost:8080/api/criteria/1" 
      }, 
      "nameCriterion": { 
      "href": "http://localhost:8080/api/criteria/1" 
      } 
     } 
     }, 
     { 
     "title": "title1", 
     "_links": { 
      "self": { 
      "href": "http://localhost:8080/api/criteria/2" 
      }, 
      "titleCriterion": { 
      "href": "http://localhost:8080/api/criteria/2" 
      } 
     } 
     } 
    ] 
    } 
} 

GET http://localhost:8080/api/criteria/1 
{ 
    "name": "name1", 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/api/criteria/1" 
    }, 
    "nameCriterion": { 
     "href": "http://localhost:8080/api/criteria/1" 
    } 
    } 
} 

GET http://localhost:8080/api/criteria/2 
{ 
    "title": "title1", 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/api/criteria/2" 
    }, 
    "titleCriterion": { 
     "href": "http://localhost:8080/api/criteria/2" 
    } 
    } 
} 

작동 example.

+0

당신의 솔루션으로 내 문제가 해결되지 않습니다. 내 기본 클래스에 @ 상속 전략을 유지하고 싶습니다. –

+0

@ PatrikMihalčin 제 답변을 업데이트했습니다. 잃어버린 현상금에 동정 ...)) – Cepr0

+0

우수. 그것은 작동합니다. 어떻게 든 @RestResource를 잊어 버렸습니다. 감사! 현상금 상금을 위해 제 시간에 - 그것을 부여하는 데 24 시간이 걸렸습니다;) –