在春季启动项目中,编组/解组应该是服务(事务)方法还是控制器?

时间:2018-02-27 20:49:57

标签: spring spring-boot spring-data spring-data-jpa

我正在使用CRUD api进行spring boot应用程序,输入和输出为json对象。在服务方法中包含json-> POJO和POJO-> json逻辑是否可以? (服务方法用事务注释标记)

//Controller 
public Map<String, String> getPersonNames(){
    return personSvc.getNames();
}

//Service method
@Transactional(readonly = true)
public Map<String, String> getNames(){
    return populateNames(repo.findAll());
}

private Map<String, String> populateNames(final List<Person> personList) { 
    return ImmutableMap.of(
    //Populate names into map
 );
}

1 个答案:

答案 0 :(得分:0)

嗯,这主要取决于您正在构建的应用程序。

根据您提供的信息(几乎没有信息),我只能说一般,但有一个域驱动设计(DDD),这在Spring应用程序中很常见。您可以在this question

的答案中找到更多信息

这种设计将您的核心域逻辑与您的技术堆栈强制您拥有的逻辑分开。简而言之,它可以在应用程序的深度保留域模型(您使用的对象)。

接下来,它使用应用程序层包装核心(其中依赖于域模型的逻辑位于其中)。应用程序层只知道如何处理底层模型。

最后一个包装器是(端口)适配器层。它使您的逻辑适应特定技术。例如,它可以是MongoDB的外部API或包装器(而应用层只声明用于收集文档的接口,该层适应(实现)它用于具体技术)。它还可以提供编组/解组。

也许示例可以更好地解释它:

  • 域模型是您的服务使用的文档(文章)。

  • 应用程序层知道如何处理它们(收集,订购,过滤文章),但对JSON序列化一无所知。

  • 资源(也称为端口适配器)知道如何将文章集合序列化为JSON并返回,但它是唯一的功能。这里没有逻辑

你可能已经看到每一层如何只知道它的底层。一篇文章什么都不知道,它只是一个模型。应用程序知道如何处理文章。并且适配器知道如何调整具体技术的处理结果,例如JSON。

所以我建议你在资源(例如你的@RestController的端点)的最高级别提供基本验证(不是针对域/应用程序层逻辑)和编组/解组过程,因为JSON只是一种使您的域适应外部连接的方法