首页 > 解决方案 > 我如何处理 REST 中的不同响应?

问题描述

我有 2 个实体。但是我的响应类型不适合实体。

@Entity
@Table(name="customer")
public class Customer {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

private String firstname;
private String lastname;
private boolean available;

@OneToMany(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name="customer_id")
private List<Product> products;


public Customer() {
    // TODO Auto-generated constructor stub
}


public Customer(String firstname, String lastname, boolean available) {
    super();
    this.firstname = firstname;
    this.lastname = lastname;
    this.available = available;
}


public String getFirstname() {
    return firstname;
}


public void setFirstname(String firstname) {
    this.firstname = firstname;
}


public String getLastname() {
    return lastname;
}


public void setLastname(String lastname) {
    this.lastname = lastname;
}


public boolean isAvailable() {
    return available;
}

public void setAvailable(boolean available) {
    this.available = available;
}

public List<Product> getProducts() {
    return products;
}

public void addProduct(Product product) {
if(products==null)
    products=new LinkedList<Product>();
    products.add(product);
}


@Override
public String toString() {
    return "Customer [id=" + id + ", firstname=" + firstname + ", lastname=" + lastname
            + ", available=" + available + "]";
}

}

[GET] localhost:8080/myapp/customers/{id} 这里我想获取客户的所有数据(id,firstname,lastname,available,products)

{
"id" : 1,
"name" : "John",
"lastname" : "Doe",
"available" : false
"products" : {...}
}

[GET] localhost:8080/myapp/customers 但在这里我想为客户获取一些数据(只是 id、firstname、lastname)

[{
"id" : 1,
"name" : "John",
"lastname" : "Doe",
},
{
"id" : 2,
"name" : "Alex",
"lastname" : "Adams",
}]

我应该为每个响应创建新类吗?或在控制器中编辑 json 数据?

标签: jsonhibernaterestspring-mvc

解决方案


你应该隔离:

  • 实体用于数据库操作

  • DTO 用于与其他服务进行通信

因此,在您的情况下,我建议您创建 DTO 来处理这种情况。请注意,有许多库可以更轻松地在 DTO 和实体之间进行转换,例如 ModelMapper。


推荐阅读