【发布时间】:2015-12-16 02:38:54
【问题描述】:
假设我有一个这样定义的简单实体:
@Entity
public class Person implements Serializable {
@Id
@GeneratedValue
private Long id;
private String fieldOne;
private String fieldTwo;
//...
private String fieldN;
}
让我们考虑一个用于处理更新 Person 的端点的简单控制器,但只更新传入的非空/空白字段:
@Controller
@RequestMapping(value = "/api/person")
public class PersonController {
@Autowired
PersonRepository personRepository;
@RequestMapping(value = "/update", method = RequestMethod.PUT)
public void updatePerson(@RequestParam("personId") Long personId,
@RequestParam("fieldOne") String fieldOne,
@RequestParam("fieldTwo") String fieldTwo,
//...
@RequestParam("fieldN") String fieldN) {
Person toUpdate = personRepository.findOne(personId);
if(fieldOne != null && !fieldOne.isEmpty())
toUpdate.setFieldOne(fieldOne);
if(fieldTwo != null && !fieldTwo.isEmpty())
toUpdate.setFieldTwo(fieldTwo);
//...
if(fieldN != null && !fieldN.isEmpty())
toUpdate.setFieldN(fieldN);
personRepository.save(toUpdate);
}
}
是否有更有效的方法来更新实体实例?我考虑过使用 DTO 和 @RequestBody 方法(即updatePerson(@Valid @RequestBody PersonDTO personDTO),但这或多或少是相同的事情。
我主要担心的是,无论我使用什么方法,我显然不想接收空/空字符串并将实体的某些字段设置为空白,但是我想尽可能高效地执行此操作(代码可读性/可移植性,当然还有运行时方面的效率),我不完全确定是否有数百个类似于我上面的 if 语句是最有效的选择。
【问题讨论】: