Glassfish/Java EE 5 Web服务的应用程序配置文件

11 configuration properties glassfish java-ee

我正在尝试编写一些简单的Java Web服务,以便我们可以从.NET调用Java代码.到目前为止,我在Glassfish下有一个概念验证工作.当IDE完成所有工作时非常简单.

现在,我真的陷入了Java 应该非常简单的事情.例如,我想要外化我的配置,这样我就可以更改连接字符串/用户名/应用程序变量/等内容,而无需重新编译.

在.NET中,您只需在网站根目录中的web.config文件中添加一些字符串,然后使用: ConfigurationManager.AppSettings["whateverIwant"];

我可以让java.util.Properties做我想要的(来自独立客户端),但我无法弄清楚.properties文件的放置位置以及如何从Web服务中获取它的路径.

我也需要我的方法在WebSphere Application Server中工作.谢谢!

Ger*_*man 7

正如其他人所提到的,它在很大程度上取决于容器,但几乎总是动态配置存储在数据库中而不是XML或.properties文件中.

我认为这就像一个概念证明,这是一个快速而肮脏的解决方案:(不要为生产代码执行此操作)使用系统属性.缺点:每次更改都需要重启容器,但不需要重新编译应用程序.

要在Glassfish中使用系统属性,您可以转到"配置 - >系统属性"部分并在其中添加属性.然后从您的应用程序内部调用

String myValue = System.getProperty("myProperty");
Run Code Online (Sandbox Code Playgroud)

获得价值.所有Java应用程序都支持这些属性,但我不知道如何在Websphere中配置它们.

  • 对于少数属性,它可能没问题,但它们并不是要替换应用程序的完整配置.一个问题是关注点的分离,因为它们可以从任何地方获得,仅供一层使用的配置也可能在其他地方被滥用.其他问题是安全性,我不确定,但我认为它们在服务器上部署的所有应用程序之间共享,因为它们在同一个JVM中运行.如果部署了恶意应用程序并通过调用System.setProperty("myProperty","fakeValue")更改配置会发生什么?他们是可变的超级全球价值观. (2认同)

Cra*_*ger 5

唉,Java EE在应用程序配置方面有一个巨大的漏洞.

你最好的选择是:

  • 使用JNDI在应用程序服务器环境中存储配置.对于用户来说,进行任何配置都很难做到便携,痛苦和绝对的噩梦.配置UI取决于正在使用的应用服务器和版本,可能是特定于该应用服务器的命令行实用程序.

  • 使用Preferences API存储您的配置,并生成您自己的UI以进行编辑.这没关系...除了您无法控制何时刷新和重新设置您的设置.某些应用服务器会在您重新部署应用时执行此操作,这可能是您不想要的.

总而言之,情况绝对臭.应用服务器没有干净,明智的方式为应用提供简单的属性映射和UI,以便使用应用服务器的管理工具对其进行编辑.

我尝试使用Web上下文参数来解决这个问题,但发现它们也是错误的.Glassfish忽略的不仅仅是正在设置的第一个Web上下文参数,如果没有servlet上下文,它们很难访问,因此您无法在整个应用程序中轻松访问它们.

如果有人有更好的答案,我很乐意听到它,因为现在的情况对于经过几次重大迭代的规范来说似乎是非常惊人的.

另请参阅:存储和编辑Java EE应用程序的配置


小智 3

不幸的是,应用程序配置依赖于容器。通常,您通过 JNDI 访问您的配置。我最近使用的方法如下:

  • 使数据库可供您的应用程序使用(通过 JNDI,使用 Glassfish 数据库“向导”)。这部分取决于容器。
  • 创建一个实体 bean,从数据库反序列化您的设置。这里的简单解决方案是有这样的东西:
@实体
公共课设置{
  @ID
  私有字符串名称;
  私有字符串值;
  ...
}

那么就是做的问题了em.find(Setting.class, "whateveriwant").getValue()。或者,您可以创建一个实体 bean,并将所有设置作为属性。无论哪种方式,这种方法都会将容器依赖性降至最低。