2017-07-11 71 views
0

我尝试构建Spring Rest应用程序。当我为返回的JSON数据创建类Activity和控制器时,它始终返回ActivityDetail的整个列表,但通常我只需要一个(最后一个项目)或不需要所有对象数据作为响应。如何在JSON响应中返回对象的特定部分

现在该怎么办?创建对象ActivityWithOneDetailActivityWhitoutTitle?但是我怎么能将必要的信息传递给这个没有溢出数据库的对象?我认为获取Activity对象并从该对象创建另一个对象(活动具有存储库public interface ActivityRepository extends JpaRepository { ... },因此我可以简单访问此对象)没有任何意义。

我看到很多在实体和对象返回保持关系的问题,因为有时我想更多的回报,从控制器更少的其它时间的数据,但是当我阻止通数据进入实体JSON响应它影响所有控制器。这不是弹性解决方案,所以,我想你可以给我另一个提示,我怎么能从我的控制器返回JSON objects,并保持良好的性能与数据库(我想从数据库中获取所有@oneToMany数据不是我应该做的每个请求)。

下面我粘贴我的部分代码,但我认为这个问题更具理论性。我的构造租用

@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 

而且部分:

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

回答

0

有几个可能的方法:

1)尽量使用春数据休息及其预测功能。 Here更说明

2)或者,如果你需要一些绝对灵活然后尝试this方法。 GraphQL是一种构建REST API的方法,其中客户端指定应该检索的数据。

P.S.您始终可以从您的实体创建DTO对象。是的,它会在运行时需要更多的类和内存,但不会对数据库造成影响。

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

我问我的活动对象的这一部分: '私人名单 activityDetails',活动对象的一个​​也没有。 –