我正在尝试实现一个非常基本的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
}
答案 0 :(得分:1)
您可以使用多个@JsonView
在每种方法中使用不同的映射。
public class Views {
public static class Create {
}
}
@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;
...
}
@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值。