【发布时间】: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