【问题标题】:Example Java EE web service with DTO and DAO带有 DTO 和 DAO 的 Java EE Web 服务示例
【发布时间】:2016-05-19 08:34:15
【问题描述】:

我正在寻找一个实现 DTO 层和 DAO 层的 J2EE Web 服务示例。我熟悉所涉及的概念,但我正在努力以一种有意义的方式将项目组合在一起。目前我有:

  • 一个 Web 服务 (WAR) 项目,它包含 Web 资源并具有 对远程项目的引用。
  • 具有到 EJB 的远程接口的远程 (JAR) 项目
  • EJB (JAR) 项目具有 EJB 的实现以及 DAO 对象 - 实体和辅助 DAO 类。以及映射器类在 DAO 和 DTO 之间进行映射。这引用了远程项目。

EJB 执行从 DAO 到 DTO 的映射,并将 DTO 返回给 Web 服务类。

从那以后,我一直在考虑将映射器类移到 Web 服务项目中,因为这似乎是一种很好的做法 - 它可以释放 EJB 来处理业务对象而不是 DTO。

类示例如下:

PersonResource Web Service 项目中的类:

@Path("/person")
@Stateless
public class PersonResource {
    @EJB
    private IPersonManagerRemote ejb;

    @GET
    @Produces("application/json")
    @Path("/{id}")
    public PersonDTO get(@PathParam("id") Long id) {
        return ejb.get(id);
    }

远程项目中的IPersonManagerRemote接口:

@Remote
public interface IPersonManagerRemote  {
    public PersonDTO get(long id);
}

PersonManager在EJB项目中的实现:

@LocalBean
@Stateless
public class PersonManager implements IPersonManagerRemote {
    @Inject
    private IPersonDAO dao;

    @Override
    public PersonDTO get(Long id) {
        return PersonMapper.getInstance().map(dao.get(id));
    }

PersonMapper EJB 项目中的单例类:

public class PersonMapper {
    // Singleton creation code...

    public PersonDTO map(Person dao) {
         //Mapping code here to copy fields
    }
}

我已经排除了IPersonDao 接口和它的实现PersonDao,因为它们非常标准。

我尝试将对映射器的调用移至 Web 资源,但随后我需要在 Web 项目和远程项目中引用 EJB 项目(用于 DAO 对象),这会导致循环引用,因为EJB 项目引用远程项目。

我的 EJB 类应该返回 DTO 还是 DAO 对象,如果是 DAO,那么映射代码应该驻留在哪里?

【问题讨论】:

  • 谢谢,我已经尝试改进它。

标签: java jakarta-ee ejb


【解决方案1】:

您不想将 dao 和映射代码移至 webapp。关注点分离。 webapp 应该只需要知道服务 api,dto 是其中的一部分。

【讨论】:

  • 不是我的意思。服务门面应该知道 DAO,DAO 和 DTO 之间的映射应该发生在那里还是在较低级别?我同意表示层不应该知道 DAO。
  • 是的,我当然希望您考虑调用 dao 和映射的 Web 服务(大概在 PersonResource 中)不在表示层中:)您希望通过这样做实现什么?
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2016-06-17
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多