2017-07-11 1 views
0

J'essaie de créer l'application Spring Rest. Lorsque je crée une classe Activity et un contrôleur pour les données JSON renvoyées, elle renvoie toujours une liste complète de ActivityDetail, mais généralement, je ne souhaite qu'un seul (le dernier élément) ou toutes les données d'objet en réponse.Comment retourner une partie spécifique de l'objet dans la réponse JSON

Que dois-je faire maintenant? Créer un objet ActivityWithOneDetail ou ActivityWhitoutTitle? Mais comment puis-je transmettre nécessairement des informations dans ces objets sans base de données de débordement? Je pense que cela n'a pas de sens d'obtenir l'objet Activity et de créer un autre objet à partir de cet objet (l'activité a le référentiel public interface ActivityRepository extends JpaRepository { ... } donc j'ai un accès simple à cet objet). Je vois beaucoup de problèmes avec garder la relation dans l'entité et l'objet renvoie parce que parfois je veux retourner plus, d'autres fois moins de données du contrôleur mais quand je bloque les données dans la réponse JSON dans l'entité affecte tous les contrôleurs. Ce ne sont pas des solutions élastiques, je suppose que vous pouvez me donner un autre moyen de retourner JSON objects de mes contrôleurs et de garder de bonnes performances avec Database (je suppose qu'obtenir toutes les données @oneToMany de la base de données n'est pas ce que je devrais faire dans chaque requête). Ci-dessous je colle une partie de mon code, mais je pense que cette question est plus théorique.

@Entity 
@Table(name = "ACTIVITY") 
public class Activity { 

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

    @Column(name = "CREATE_DATE") 
    @Temporal(TemporalType.TIMESTAMP) 
    @NotNull 
    private Date createDate; 

    @Column(name = "ACTIVE") 
    @NotNull 
    private Boolean active; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "ACTIVITY_USER", joinColumns = @JoinColumn(name = "ACTIVITY_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID")) 
    @JsonBackReference 
    private Set<User> users; 

    @OneToMany(mappedBy = "activity_id") 
    private List<ActivityDetail> activityDetails; 

    @ManyToOne 
    @JoinColumn(name = "ACTIVITY_OWNER") 
    private User activityOwner; 

    @OneToMany(mappedBy = "activityParent") 
    @JsonBackReference 
    private List<Task> activityTasks; 
} 
// Constructor, Getter, Setter 

Et une partie de ma location de constructeur:

@RequestMapping(value = "/api/{userId}/activities", method = RequestMethod.GET) 
    public List<Activity> activities(HttpServletRequest request, @PathVariable(value="userId") final Long id){ 
     User user = userRepository.findById(id); 

     List<Activity> activities = activityRepository.findAllByUsers(user); 

     return activities; 
    } 

Répondre

0

Il y a quelques approches possibles:

1) Essayez d'utiliser Rest données Spring et leurs projections fonction . Here est plus description

2) Ou, si vous avez besoin d'une flexibilité absolue, essayez l'approche this. GraphQL est une approche de création d'API REST dans laquelle le client spécifie les données à extraire.

P.S. Vous pouvez toujours créer des objets DTO à partir de vos entités. Oui, cela nécessitera plus de classes et de mémoire lors de l'exécution, mais aucun problème avec la base de données.

0
@RequestMapping(value = "/api/{userId}/activities", method = RequestMethod.GET) 
    public Activity activities(HttpServletRequest request, @PathVariable(value="userId") final Long id){ 
     User user = userRepository.findById(id); 

     List<Activity> activities = activityRepository.findAllByUsers(user); 

     return activities.get(0); 
    } 
+0

Je pose des questions sur cette partie de mon objet Activity: 'Liste privée activityDetails', pas un objet Activity. –