【问题标题】:Builder pattern on RequestBodyRequestBody 上的构建器模式
【发布时间】: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


【解决方案1】:

首先,managers 实体应该是 manager。 保持单数 from 代表一个类,其中一个实例代表一个单独的“事物”。

两个经理合二为一。看起来很难理解 哪个应该保存到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 结合使用是一种好习惯,以及如何做得更好?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多