【发布时间】:2017-08-09 12:28:58
【问题描述】:
我一直在开发spring boot rest api服务,这是我的rest controller方法之一:
@RequestMapping(value = "manager", method = RequestMethod.PUT, produces = "application/json;charset=UTF-8")
@ResponseBody
public String updateManager(@RequestBody Managers manager,
@RequestParam(value = "sid", required = true, defaultValue = "") String sid) throws TimeoutException, SocketTimeoutException, SocketException {
final Integer managerId = checkSession(sid);
final String result = managerController.validateManagerData(managerId, manager.getName(), manager.getSurname(), manager.getPassword());
return result;
}
Manager 控制器它是验证器类(例如检查空引用的电子邮件)
if (name != null) {
if (!GMoikaStringUtils.isValidStringLength(50, name)) {
throw new InvalidUserInputException("Wrong name format", CLASS_NAME, "validateManagerData", params);
}
}
if (surname != null) {
if (!GMoikaStringUtils.isValidStringLength(50, surname)) {
throw new InvalidUserInputException("Wrong surname format", CLASS_NAME, "validateManagerData", params);
}
}
验证数据后我打电话给Manager service class
public JsonObject updateManager(Integer managerId, String name, String surname, String password) {
Managers manager = managerRepository.findOne(managerId);
if (name != null) {
manager.setName(name);
}
if (surname != null) {
manager.setSurname(surname);
}
if (password != null) {
manager.setPassword(password);
}
managerRepository.save(manager);
return manager.toJson();
}
我的问题是,如果我更改顺序,我会将很多参数传递给方法(姓名、姓氏、电子邮件、密码等),我会将错误的参数保存到数据库中。第一个决定是传递 Manager 对象而不是 manager 参数。 但在这种情况下,我将有以下情况:
public JsonObject updateManager(Integer managerId,Managers manager2) {
Managers manager = managerRepository.findOne(managerId);
if (manager2.name != null) {
manager.setName(name);
}
if (manager2.surname != null) {
manager.setSurname(surname);
}
if (manager2.password != null) {
manager.setPassword(password);
}
managerRepository.save(manager);
return manager.toJson();
}
两个经理合二为一。看起来很难理解应该将哪个保存到 db 中
第二个决定是使用Builder模式(BP),但我不知道将BP与ORM一起使用是否是一种好习惯以及如何做得更好?
【问题讨论】:
-
为什么不使用内置的验证注解?据我所知,您没有使用复杂的逻辑验证 manager,而是使用标准的空值检查。
-
我有,我需要使用我的验证(不带注释)来抛出特定的异常
-
您也可以使用注释抛出您的特定异常。一种方法是:在 advice 中捕获验证异常,然后用它做你想做的事(记录、抛出另一个异常、将错误响应作为请求响应发送等)
标签: java design-patterns spring-boot