RequestBody上的Builder模式

时间:2017-08-09 12:28:59

标签: java design-patterns spring-boot

我一直在开发spring boot rest api服务,这是我的其他控制器方法之一:

 @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;

    }

管理器控制器它是验证器类(例如,检查空引用上的电子邮件)

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 params。 但在这种情况下,我将有以下情况:

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一起使用以及如何更好地使用它是一种好的做法?

1 个答案:

答案 0 :(得分:2)

首先,managers实体应为manager。 保持单数表示一个实例代表个体“事物”的类。

  

一种方法中的两位经理。这看起来很困难   哪一个应该保存到db

对于参数的通用命名,是:

public JsonObject updateManager(Integer managerId, Manager manager2) {

更具体一点,它应该没问题:

public JsonObject updateManager(Integer managerId, Manager managerDataToSave) {

或者如果它更有意义,请引入一个更具体的自定义类:

例如:ManagerInfoToUpdate将包含要更新的信息(姓名,姓名,电子邮件等)。

以这种方式使用它:

public JsonObject updateManager(Integer managerId, Manager ManagerInfoToUpdate) {
  

第二个决定是使用Builder模式(BP),但我不知道是   将BP与ORM结合使用以及如何更好地实施它是一种很好的做法?

ORM,例如Hibernate使用反射来创建实体实例。因此,它需要一个无参数构造函数。
它违背了Builder模式的目的 您可能不应该将它用于Hibernate实体。