这更像是一个“最佳实践”的问题。我正在尝试spring-boot和hibernate来构建一个小的CRUD服务。
假设我有一个名为Customer的实体(注释为hibernate entity...)它有各种属性,比如name、middlename、lastname等等。
@Entity
@Table(name = "OCUS")
public CustomerEntity {
// Props
@Column(name = "Name")
@SerializedName("name")
@Expose
private String name;
@Column(name = "MName")
@SerializedName("mname")
@Expose
private String middlename;
...
@Column(name = "Status")
@SerializedName("status")
@Expose
private CustomerEntityType status = CustomerEntityType.NEW;
@Column(name = "Valid")
@SerializedName("valid")
@Expose
private Boolean valid = false;
// getters and setters
}
我还创建了一个扩展JPARepository的CustomerEntityRepository,如下所示:@存储库公共接口CustomerEntityRepository扩展JpaRepository {
}
在那之后,我创建了一个RestController来拥有GET/POST/DELETE/...为我的客户提供的方法。
@RestController
@RequestMapping("/v1/customers")
public class CustomerRestController {
@Autowired
CutomerEntityRepository customerRepo;
@PostMapping
public ResponseEntity<CustomerEntity> createCustomer(@RequestBody CustomerEntity customer) {
customerRepo.save(customer);
// ... Build ResponseEntity...
}
...
}
假设RequestBody不包含我的CustomerEntity中的所有属性,也许我有"status“或"valid”这样的属性。
例如:
{
"name" : "Jon",
"lastName" : "Doe",
"field1" : "value1",
...
}
我现在的问题是:
必须做什么,以便我要保存到CustomerEntityRepository中的客户获得设置的所有标准值(请参阅属性:状态和有效),而不必检查所有属性(如果它包含在请求主体中)。
我的目标只是保存客户,当通过我的Rest控制器获得客户时,这些客户用所有默认值表示我的CustomerEntity。
感谢您的反馈
罗伯特
编辑
因为我的问题似乎不清楚,所以我将尝试进一步阐述它:
假设我的REST端点接收到以下表示CustomerEntity的Json:
{
"name" : "Jon",
"lastName" : "Doe"
}
spring-boot包中的反序列化程序似乎在查找我的customerentity的合适构造函数。所以如果我像这样实现一个构造函数:
public CustomerEntity(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
反序列化程序试图通过这个构造函数很好地构造customerEntity。我的所有标准值,如valid将被设置为false,status将被设置为CustomerEntityType.NEW;
让我们假设下一个传入的Json是:
{
"name" : "Jon",
"lastName" : "Doe",
"middleName" : "Harry"
}
但这一次,我没有合适的构造函数来通过构造函数创建客户。因此,我认为创建大量的构造函数来表示所有可能的变体并不是正确的方式。
我不知道反序列化器现在是如何在JSON之外创建我的CustomerEntity对象的,但是我在我的方法中接收到的对象:
@PostMapping
public ResponseEntity<CustomerEntity> createCustomer(@RequestBody CustomerEntity customer) {
customerRepo.save(customer);
// ... Build ResponseEntity...
}
只设置了3个属性:name、lastName、middleName,CustomerEntity的所有其他属性都为空。我需要防止这样的CustomerEntities被保存到数据库中。
希望这个案例现在更清楚了。
发布于 2018-06-18 11:03:49
您可以使用JSR 380的实现hibernate validator
。
顺便说一句,如果您正在使用hibernate验证器提供的任何注释,则必须在控制器中使用来自javax.validation
包的@valid
注释。
所以你的控制器应该是这样的,
@PostMapping
public ResponseEntity<CustomerEntity> createCustomer(@Valid @RequestBody CustomerEntity customer) { }
你可以在这里阅读更多详细信息:https://spring.io/guides/gs/validating-form-input/ http://hibernate.org/validator/
发布于 2018-06-18 12:04:23
如果你想设置字段/属性的默认值,你可以使用:
@Column(name="status", columnDefinition="Decimal(10,2) default '100.00'")
https://stackoverflow.com/questions/50906005
复制相似问题