所以,假设我有一个简单的实体定义如下:
@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语句是最有效的选择。
答案 0 :(得分:0)
@RequestParam
实际上有另一个参数defaultValue
,你可以使用它,这样参数就不会是空的&所以你可以减少检查空和&空值
@RequestParam(value="field" , defaultValue="****")
使用它已经消除了if(fieldOne != null && !fieldOne.isEmpty())
并调用直接包装字段的toUpdate.setFieldOne(...)
。使用defaultValue
自动设置false
所需,并在您的网址中缺少请求参数时,将默认值插入到您的输入参数中。