2017-08-15 2 views
1

J'ai une entité appelée contentPath, avec peut avoir un parent du même type, et fils du même type, représenté avec quelque chose comme:données Spring Rest Beaucoup de beaucoup la cartographie de projection d'arbres

@Id 
    @Column(name = "ID") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name = "NAME", length = 50) 
    @NotNull 
    private String name; 

    @Column(name = "DESCRIPTION") 
    private String description; 

    @ManyToOne 
    @JoinColumn(name="CONTENT_PATH_ID") 
    public ContentPath contentPath; 

    @OneToMany(mappedBy="contentPath") 
    public Set<ContentPath> contentPaths; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
      name = "ACTIVITY_CONTENT_PATH", 
      joinColumns = {@JoinColumn(name = "CONTENT_PATH_ID", referencedColumnName = "ID")}, 
      inverseJoinColumns = {@JoinColumn(name = "ACTIVITY_ID", referencedColumnName = "ID")}) 
    private Set<Activity> activities; 

Je mon ContentPathRepository, qui l'expose comme une API.

@RepositoryRestResource(collectionResourceRel = "contentPaths", path = "contentPaths", excerptProjection = ContentPathProjection.class) 
public interface ContentPathRestRepository extends PagingAndSortingRepository<ContentPath, Long> { 

} 

et ma projection, qui devrait formater correctement mon objet.

@Projection(name = "contentPathProjection", types = ContentPath.class) 
public interface ContentPathProjection { 
    Long getId(); 
    String getName(); 
    Set<ContentPath> getContentPaths(); 
} 

Je comptais obtenir une liste des ContentPaths, qui ont leurs ContentPaths à l'intérieur, et je me suis succès, mais il n'apporte pas les ID, il apporte nom et la description seulement, et il est très bizarre parce que mon la projection n'a pas la description.

réponse actuelle:

"name": "BOOK 1", 
"id": 1, 
"contentPaths": [ 
    { 
     "name": "UNIT 1", 
     "description": "UNIT 1 description" 
    }, 
    { 
     "name": "UNIT 2", 
     "description": "UNIT 2 description" 
    } 
] 

Pourquoi cela se produit? Comment le réparer?

+0

vous avez getter public 'ContentPath.id'? –

+0

Oui. 'public Long getId() {return id;}' Mais la chose étrange est aussi de retourner une description, mais je n'ai pas de description dans ma projection. –

+0

Et il retourne aussi l'ID pour le premier niveau, mais pas pour le second. –

Répondre

1

Ceci est un comportement normal de SDR. Il ne montre pas id par défaut. Pour activer ce registre juste un haricot comme ceci:

@Bean 
public RepositoryRestConfigurerAdapter repositoryRestConfigurerAdapter() { 
    return new RepositoryRestConfigurerAdapter() { 
     @Override 
     public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
      config.exposeIdsFor(ContentPath.class); 
      super.configureRepositoryRestConfiguration(config); 
     } 
    }; 
} 

A propos description - vous avez ce domaine:

@Column(name = "DESCRIPTION") 
private String description; 
+0

Il a résolu le problème, mais je voudrais comprendre pourquoi? Comment puis-je exposer les autres champs, comme les relations? –

+0

@LuizMitidiero regardez: https://spring.io/understanding/HATEOAS et https://speakerdeck.com/olivergierke/spring-data-rest-repositories-meet-hypermedia – Cepr0

+0

@LuizMitidiero ... et ceci: https: //speakerdeck.com/olivergierke/hypermedia-apis-with-spring-5 – Cepr0