2017-05-10 57 views
5

I sprężynowo dane reszta aplikacji w oparciu o repozytoriummoduł Jackson obsłużyć abstrakcyjne korzeń kruszywo i jej podklas w Spring Danych REST

public interface CriterionRepository extends JpaRepository<Criterion, Long> { 
} 

natomiast Criterion jest klasa bazowa:

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

i NameCriterion jest jego podklasa

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

Eksport danych REST z wiosny on przechowalni jako zasobu REST i można do niego dostęp w http://localhost:8080/api/criteria/

wyeksportowanych zasobów wygląda następująco:

{ 
    "_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 
    } 
} 

Kiedy próbuję śledzić link, samodzielne, nie ma odwzorowania dla http://localhost:8080/api/nameCriterion/1

mogę śledzić http://localhost:8080/api/criteria/1 chociaż i dostaję odpowiedź bez nazwy pola z NameCriterion

{ 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/api/nameCriterion/1" 
     }, 
     "nameCriterion": { 
      "href": "http://localhost:8080/api/nameCriterion/1" 
     } 
    } 
} 

Zakładam, że jest to problem z programem do mapowania w języku Jackson zdefiniowanym w eksporcie REST, który nie został poprawnie zmodyfikowany do obsługi klasy abstrakcyjnej Criterion używanej w JpaRepository jako root agregatu.

Jakie modyfikacje Jackson powinienem zastosować, aby działał poprawnie?

Innymi słowy, jaki moduł Jackson powinienem stworzyć?

+0

Jeśli moja odpowiedź ci pomogła, nie zapomnij jej zaakceptować!) – Cepr0

Odpowiedz

3

Nie ma potrzeby tworzenia modułu Jackson. Aby skorzystać z jednej tabeli do odziedziczonych jednostek możemy użyć @RestResource adnotacji oznaczyć je jako te same zasoby:

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

więc możliwe staje się uzyskanie wszystkich zasobów (NameCriterion i TitleCriterion) w jedno wyjście:

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" 
    } 
    } 
} 

Praca .

+0

Twoje rozwiązanie nie rozwiązuje mojego problemu. Chcę zachować strategię @Inheritance w mojej klasie podstawowej –

+0

@ PatrikMihalčin Zaktualizowałem swoją odpowiedź. Żałować utraconej nagrody ...)) – Cepr0

+0

Doskonały. To działa. Jakoś zapomniałem o @RestResource. Dzięki! W samą porę na nagrodę za bounty - miałem 24 godziny na udzielenie jej;) –