如何限制@RequestBody中映射的字段

时间:2019-10-23 18:41:02

标签: spring-boot jackson spring-restcontroller

我正在尝试实现一个非常基本的Spring Boot Web应用程序。在此过程中,我借助@RequestBody将JSON对象映射到实体(例如Customer Entity)。

addCustomer 方法中,我只想绑定/映射 firstName lastName 字段,而忽略 Id 该字段,即使客户端响应JSON具有该字段也是如此。

updateCustomer 方法中,我需要映射包括 Id 在内的所有字段,因为我需要 Id 字段来更新实体。

@RequestBody的自动映射过程中,如何忽略某些或一个字段。

@RestController
@RequestMapping("/customer-service")
public class CustomerController {
    @Autowired
    CustomerServiceImpl customerService; 

    //This method has to ignore "id" field in mapping to newCustomer
    @PostMapping(path = "/addCustomer")
    public void addCustomer(@RequestBody Customer newCustomer) {
        customerService.saveCustomer(newCustomer);
    }

    //This method has to include "id" field as well to updatedCustomer
    @PostMapping(path = "/updateCustomer")
    public void updateCustomer(@RequestBody Customer updatedCustomer) {
        customerService.updateCustomer(updatedCustomer);
    }
}
@Entity
@Table(name = "CUSTOMER")
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long cusId;

    private String firstName;
    private String lastName;

    //Default Constructor and getter-setter methods after here
}

2 个答案:

答案 0 :(得分:1)

您可以使用多个@JsonView在每种方法中使用不同的映射。

  1. 定义视图:
public class Views {
    public static class Create {
    }
}
  1. 选择每个视图中应使用的字段:
@Entity
@Table(name = "CUSTOMER")
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long cusId;

    @JsonView(Views.Create.class)
    private String firstName;
    @JsonView(Views.Create.class)
    private String lastName;
    ...
}
  1. 告诉Spring MVC以特定方法使用此视图:
@PostMapping(path = "/addCustomer")
public void addCustomer(@RequestBody @JsonView(Views.Create.class) Customer newCustomer) {
    customerService.saveCustomer(newCustomer);
}

答案 1 :(得分:0)

TL; DR:使用下列之一:

  • @JsonIgnoreProperties("fieldname")在您的班上。
  • @JsonIgnore忽略字段上的映射。

示例:

@Getter
@Setter
@JsonIgnoreProperties("custId")
public class Customer {

@JsonIgnore
private String custId;
private String firstName;
private String lastName;

}

但是,由于您具有相同的POJO,它将跳过两个请求的“ custId”映射。

AFAIK,您不应该为custId(添加客户)收到@PostMapping值,因此应将其动态设置为null或默认值。并且在创建用户时,还应该为其创建ID或让数据库来处理它。

对于@PutMapping(更新用户),您必须获取可用于识别用户然后进行更新的ID值。