如何在JSON响应中返回对象的特定部分

时间:2017-07-11 18:54:43

标签: java spring entity

我尝试构建Spring Rest应用程序。当我为返回JSON数据创建类Activity和控制器时,它总是返回ActivityDetail的整个列表,但通常我只想要一个(最后一项)或者不是所有对象数据作为响应。

我现在该怎么办?创建对象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;
    }

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

几乎没有可能的方法:

1)尝试使用 Spring Data Rest 及其预测功能。 Here更多描述

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

P.S。您始终可以从实体创建DTO对象。是的,它将在运行时需要更多的类和内存,但数据库没有问题。