我正在开发一个带有DAO层的JAX-RS项目。我不确定要遵循哪种架构。
例如,假设我们有一个实现ProductDAOImpl
接口的ProductDAO
类,以及一个ProductRS
类作为产品REST服务的入口点。
问题1
应该在哪里创建ProductDAO
(实际ProductDAOImpl
)实例?
选项:
A)在需要访问产品的ProductRS
类的每种方法中?
B)作为ProductRS
班的成员?
(这个选项可以引入数据竞争吗?不确定容器如何处理REST服务类 - 可能与下面的问题2有关。)
问题2
我应该为JAX-RS类使用注释,例如@Stateless
?
问题3
在具有DAO层和可能的服务层的JAX-RS应用程序中,架构和类关系的最佳实践是什么?
(非常欢迎任何研究此主题的链接。)
问题4
DAO实现类是否应该提供静态方法? (见here)
实施具体细节
使用带有Glassfish服务器的JAX-RS的Jersey实现和带有对数据源的JDBC访问的DAO层。
答案 0 :(得分:1)
问题1
我不会明确地创建实例。通常依赖注入就是出于这个原因 - 在ProductRS类中注入ProductDAO接口。
问题2 - 3
您的技术堆栈的一些示例(尽管不完全相关)。
Jersey + Spring示例: https://www.mkyong.com/webservices/jax-rs/jersey-spring-integration-example/
Jersey + Guice示例: http://www.nailedtothex.org/roller/kyle/entry/lean-example-of-tomcat-82
Guice + Hibernate示例: http://www.benmccann.com/hibernate-with-jpa-annotations-and-guice/
Jersey + Hibernate + Spring示例: http://www.benchresources.net/jersey-2-x-web-service-integrating-with-spring-and-hibernate-orm-framework-using-annotation/
问题4
提供的链接(Should we always use Asynchronous JAX-RS resources For mobile backend?)
中没有静态方法<强>更新强>
由于测试困难,建议避免在DAO中使用静态方法。相关讨论:
答案 1 :(得分:0)
回答Q1 :创建'ProductDAO'实例作为'ProductRS'类的成员,您可以在所有方法中使用相同的实例。
回答Q2 :您可以为JAX-RS类使用注释,如果您的状态较少的行为是您的功能要求,那么您可以使用'@Stateless'。只有在REST服务上需要JavaEE Security时才需要“@Stateless”。