Web服务如何独立于DAL实现?

时间:2015-10-31 11:28:43

标签: java spring web-services architecture

我正在开发a project,可用于两个数据访问层实现:

  • 图表数据库,
  • 关系数据库。

实现的选择取决于Tomcat启动时的Spring活动配置文件(spring.profiles.active = graph-database,或spring.profiles.active = relational-database)。这很有效。

我正在服务层添加REST服务。目前,我只注释了retrieveAllCategories方法,该方法响应“/ rest / resources / categories”URL。它按预期显示JSON,但我的问题是,当服务器使用DAL图数据库实现时,输出与使用关系数据库模块时的输出不同。

不同之处在于与“ResourceCategory”类关联的对象集合。我已经不得不使用@JsonIgnore@JsonManagedReference@JsonBackReferenceexample等注释来注释我的“JPA”域bean,以避免无限递归。这是一件相当漫长而无聊的事情,我宁愿不要在我的项目中做到这一点。

我的问题:是否有更好的方法(比非常耐心地注释每个“关系数据库”bean)以确保我的Web服务将提供完全相同的数据,而与所使用的DAL实现无关?

1 个答案:

答案 0 :(得分:1)

您问题的最常见解决方案是使用数据传输对象(DTO)。

基本上,您创建了一个新类,它准确表示Web服务的命令/响应应该是什么。

然后,这只是转换到该类的问题。

示例:

public class JpaMovie {

    @OneToMany
    private List<Actor> actors;

    // Whatever you need in JPA DAL.
}

public class GraphMovie {
    // Whatever you need in Graph DAL.
}

public class MovieDTO {
    // Structure of the web service response.
    // Always convert to this type before returning.
    // This way, no matter the DAL, your response
    // structure will always be the same.
}

以下是如何在您的案例中使用它们(您正在为您的域模型使用setter / getter接口):

@Controller
public class MovieController {

    @Autowired
    private MovieService movieService;

    @RequestMapping("/movies")
    public @ResponseBody MovieDTO findById(@RequestParam String id) {
        MovieInterface movie = movieService.findById(id);
        return MovieDTO.from(movie);
    }

}