2017-07-11 105 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',活動對象的一個​​也沒有。 –