我有一个java EE应用程序EE5 EJB3。我使用NetBeans 6.7和GlassFish 2.x开发 我需要一个部署/客户端特定的配置文件(* .xsl,*。xml)。
我的问题是:
1)我在哪里放置ear文件外部的文件?
2)如何将文件加载到会话bean中?我可以使用注射吗?
我设法使用ejb-jar.xml为文件名注入@Resource。
非常感谢提前。 -G。
答案 0 :(得分:5)
我想这不是你所期待的,但正确的答案是你不应该这样做!根据{{3}},更准确地说是编程限制:
企业bean不得使用
java.io
包来尝试访问文件系统中的文件和目录。
这句话之后是这个解释:
文件系统API不适合业务组件访问数据。业务组件应使用资源管理器API(如JDBC)来存储数据。
这句话背后的原因是:
既然你知道这一点,如果你仍然想要做你的想法,如果你的EJB容器不限制使用java.io
包中的类,那么我会把一个只读文件放在类路径,最好是在JAR中,并使用getResource()
的{{1}}或getResourceAsStream()
方法访问它。但实际上,您应该牢记规范,它可以帮助您构建可移植的应用程序。
答案 1 :(得分:2)
如果您可以为每个目标部署组装一个EAR(可能maven profile
可以在此区域中提供帮助),那么您可以像资源一样加载它。
另一个选择是查看J2EE Application Deployment Specification(JSR-88),为每个环境设置一个带有 N 部署计划的EAR。
您还可以决定将文件存储在文件系统上(即使它是禁止的)。如果您希望路径位于ejb.xml
,那么您需要再次以不同方式组装或部署EAR - 那么没有大的收获。然后,另一个选项是使用Glassfish Custom JNDI Resource来从管理控制台直接配置路径。你的应用程序。可以根据配置的路径加载文件。
答案 2 :(得分:1)
请参阅此问题:Process files in Java EE。
规范禁止使用java.io访问文件,它一般不禁止文件访问。
文件在企业应用程序中导致问题的一个主要原因是它们在多用户环境中难以安全有效地使用。特别是,文件锁会严重限制可伸缩性。
使用类加载器按Pascal建议的每个会话读取一次配置文件不太可能在大多数应用程序服务器上引起问题,除非可能是热部署。
JNDI属性可用作配置文件的替代。 JNDI属性在部署描述符中定义,并在部署时将值绑定到JNDI名称。应用程序可以使用JNDI名称从应用程序内部查找值。