11

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

现在我真的陷入了 Java 中应该非常简单的东西。例如,我想将我的配置外部化,这样我就可以在不重新编译的情况下更改连接字符串/用户名/应用程序变量/等内容。

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

我可以让 java.util.Properties 做我想做的事(从独立客户端),但我不知道在哪里放置 .properties 文件以及如何从 Web 服务中获取它的路径。

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

4

5 回答 5

7

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

正如我所看到的,这就像一个概念证明,这是一个快速而肮脏的解决方案:(不要对生产代码这样做)使用系统属性。缺点:每次更改都需要重新启动容器,但不需要重新编译应用程序。

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

String myValue = System.getProperty("myProperty");

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

于 2011-11-07T22:40:51.323 回答
5

唉,Java EE 在应用程序配置方面有一个巨大的问题。

您最好的选择是:

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

  • 使用 Preferences API 来存储您的配置,并生成您自己的 UI 来编辑它。这没关系......除了您无法控制您的设置何时刷新和重新启动。当您的应用重新部署时,一些应用服务器会执行此操作,您可能不希望这样做。

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

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

如果有人有更好的答案,我很想听听,因为对于经过几次重大迭代的规范来说,目前的情况似乎非常惊人。

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

于 2011-11-04T11:23:46.370 回答
3

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

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

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

于 2009-09-28T00:52:07.300 回答
2

The best solution I've found so far is "EAC4J (External Application Configuration For Java)". I've used successfully in many projects.

于 2012-05-24T07:21:22.960 回答
2

将以下代码放入 ServletContextListener 的 contextInitialized 方法中:

ServletContext sc = sce.getServletContext();
Properties systemProps = System.getProperties();            
String path = sc.getRealPath("WEB-INF/application.properties");
systemProps.load(new FileInputStream(path));

这从您的 Web 应用程序启动时的 WEB-INF 文件夹中的 application.properties 中读取。每次配置更改时都需要重新启动,但在我看来,这是应该的。

于 2014-03-10T19:12:21.280 回答