Spring MVC应用程序中值对象的实际应用

时间:2016-07-13 08:15:24

标签: java spring-mvc domain-driven-design value-objects

在我用Hibernate和Spring MVC编写的应用程序中,我有一些代表Customer的简单类,他的主办公室地址和其他办公室的位置列表。有一个允许添加和编辑Customer数据的表单,然后Spring MVC将其映射到DTO,验证,发送到Service,将其转换为(略有不同)实体并保存。

我想过使用值对象来表示和隐式验证某些对象 - 即PhoneNumber,Address,但我真的不知道如何在这些框架中使用它们 - 即使我认为我理解了Value Object概念和不变性

如果我将在表示层中使用的DTO中使用它们,那么我不能依赖于从表单到对象的映射字段的Spring机制 - 因为没有setter。我必须在Controller或Service中手动进行映射。

我应该在实体中使用值对象(嵌入它们)吗?或者这可能是使用Value Objects的过于简单的情况?

2 个答案:

答案 0 :(得分:0)

这是我的谦虚回应。

  • DTO是简单的数据容器,没有逻辑,
  • 和值对象相反并封装逻辑。

只是一个有趣的事情,DTO在过去用Java称为值对象。

查看它的一种方法(正如我所读)是让值对象封装实体的所有逻辑,只处理身份的实体。

DTO允许将域模型与UI(或任何其他端口/适配器)分离。

值域对象应该在域层之外使用吗?我不知道,但我个人不这样做。在我的设置中,它们由应用程序层和域内使用,但在应用程序层之外只有DTO。

我有Spring可以处理的DTO和数据映射器来进行转换(dto到UI / app层边界的模型)。 DTO通常可以设置(根据某些人的事件公共财产)。

现在,如果要使用框架映射的不可变对象,解决方案取决于您使用的技术。当我使用JSON(和Jackson)进行webservices时,我直接用构造函数中的@JsonCreator注释映射不可变命令对象,但我将我的pojos连接到jackson。为避免这种情况,您还可以将客户序列化程序添加到框架中,以使其自动转换控制器方法参数周围的数据结构。

否则,您始终可以使用数据映射器或工厂方法进行映射。 (我相信你写了一篇关于那篇文章......)

答案 1 :(得分:0)

您的问题主要不是关于价值对象,但您主要关心的问题(如果我理解正确的话)是如何从网络表单发送数据,验证数据并将数据保存在实体中。

创建一个表单对象,例如MyForm,其中包含用户可以在屏幕中输入的所有字段。表单对象用于将数据传输到服务器,例如:

class MyForm {

    @NotBlank
    private String name;

    @NotBlank
    private String phoneNumber;

    @NotBlank
    private String address;

    // getters and setters
}

在服务器端控制器验证,转换和存储数据:

@Controller
class GuestbookController {

    @RequestMapping(value = "/guestbook", method = RequestMethod.GET)
    String myget(Model model, MyForm form) {
        // put data on model
    }

    @RequestMapping(value = "/mysubmit", method = RequestMethod.POST)
    String mysubmit(@Valid MyForm form, Errors errors, Model model) {

        if (errors.hasErrors()) {
            return myget(model, form);
        }

        myrepository.save(new MyEntity(form.getName(), form.getPhoneNumber(), form.getAddress()));
        return "redirect:/myview";
    }

}

您可能需要有关地址的更多详细信息,而不是单个字符串中的内容。然后,是的,使用包含所有地址详细信息的值对象就可以了。