2009-07-07 11 views
11

Estoy tratando de escribir algunos servicios web Java simples para que podamos llamar al código Java de .NET. Hasta ahora, obtuve una prueba de concepto trabajando bajo Glassfish. Bastante sencillo cuando el IDE hace todo el trabajo.Archivos de configuración de la aplicación para los servicios web Glassfish/Java EE 5

Ahora estoy realmente empantanado en cosas en Java que debería ser realmente simple. Por ejemplo, quiero externalizar mi configuración para poder cambiar cosas como cadenas de conexión/nombres de usuario/variables de aplicación/etc. sin volver a compilar.

En .NET, usted acaba de pegarse unas cadenas en el archivo web.config en la raíz del sitio web y el uso: ConfigurationManager.AppSettings["whateverIwant"];

puedo conseguir java.util.Properties a hacer lo que quiera (de un cliente independiente), pero no puedo averiguar dónde colocar el archivo .properties y cómo obtener la ruta dentro del servicio web.

Necesito mi enfoque para trabajar dentro de WebSphere Application Server también. ¡Gracias!

+0

hmm. Realmente dudo sobre la necesidad de la etiqueta ".net" en esta pregunta. – serhio

+0

Yo también. Remoto. –

Respuesta

3

Desafortunadamente, la configuración de la aplicación depende del contenedor. En general, accede a su configuración a través de JNDI. El enfoque que he usado recientemente fue el siguiente:

  • Hacer una base de datos disponible para su aplicación (a través de JNDI, utilice la base de datos Glassfish "asistente"). Esta parte es dependiente del contenedor.
  • Cree un bean de entidad que deserialice su configuración de la base de datos. La solución simple aquí es tener algo como esto:
 
@Entity 
public class Setting { 
    @Id 
    private String name; 
    private String value; 
    ... 
} 

Entonces es una cuestión de hacer em.find(Setting.class, "whateveriwant").getValue(). Alternativamente, podría crear un bean de entidad único con todas las configuraciones como atributos. De cualquier forma, este enfoque reduce la dependencia del contenedor a un mínimo.

5

Por desgracia, Java EE tiene un agujero gigante en la cabeza cuando se trata de la configuración de la aplicación.

Su mejor apuesta es a cualquiera:

  • uso JNDI para almacenar configuración en el entorno de servidor de aplicaciones. Esto es difícil de llevar a cabo de manera portátil, dolorosa y una pesadilla absoluta para que el usuario haga cualquier configuración. La interfaz de usuario de configuración depende de qué aplicación de servidor y versión está en uso y puede ser una utilidad de línea de comandos específica para ese servidor de aplicaciones.

  • Utilice la API de preferencias para almacenar su configuración y cree su propia interfaz de usuario para editarla. Esto está bien ... excepto que no puede controlar cuándo se vacían y vuelven a inundar sus configuraciones. Algunos servidores de aplicaciones harán esto cuando su aplicación se vuelva a implementar, lo que probablemente no desee.

En general, la situación es absolutamente desagradable. No hay una manera limpia y sensata para que un servidor de aplicaciones proporcione una aplicación con un mapa de propiedades simple y una IU para editarla usando las herramientas de administración del servidor de la aplicación.

Intenté evitar esto usando los parámetros del contexto web, pero encontré que también tenían errores. Glassfish ignoraba más que el primer parámetro de contexto web que se estaba configurando, y era difícil acceder a ellos sin tener un contexto de servlet, por lo que no se podía acceder fácilmente a ellos en toda la aplicación.

Si alguien tiene una mejor respuesta, me encantaría escucharla, porque la situación en sí parece increíble para una especificación que ha sido sometida a varias iteraciones importantes.

ver también: Storing and editing configuration for Java EE applications

+0

Puede usar un MXbean para almacenar configuraciones (Map of property = value) para que pueda leer/actualizar configuraciones en tiempo de ejecución con herramientas como jconsole/visualvm – gpilotino

7

Como otros han mencionado, que depende en gran medida del contenedor, pero casi siempre configuraciones dinámicas se almacenan en una base de datos en lugar de archivos XML o .properties.

Como veo que esto es solo como una prueba de concepto, aquí hay una solución rápida y sucia: (no haga esto para el código de producción) use Propiedades del sistema. Desventaja: con cada cambio necesita reiniciar el contenedor, pero no necesita volver a compilar la aplicación.

Para usar las propiedades del sistema en Glassfish puede ir a la sección "Configuración -> Propiedades del sistema" y agregar propiedades allí. Luego, desde su aplicación, solo llame al

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

Para obtener el valor. Todas las aplicaciones java admiten estas propiedades, pero no sé cómo configurarlas en Websphere.

+0

No entiendo por qué dice que estas propiedades del sistema son una solución rápida y sucia no para producción Por lo que puedo decir, creo que tienen su lugar además del almacenamiento de la base de datos, para casos raros, y en producción también. –

+2

Para algunas propiedades, puede estar bien, pero no fueron diseñadas para reemplazar la configuración completa de una aplicación. Un problema es la separación de las preocupaciones, ya que están disponibles desde cualquier lugar, las configuraciones destinadas a ser utilizadas solo por una capa también pueden ser mal utilizadas en otros lugares. Otro problema es la seguridad, no estoy seguro, pero creo que se comparten entre todas las aplicaciones implementadas en el servidor porque se ejecutan en la misma JVM. ¿Qué sucede si se implementa una aplicación maliciosa y cambia su configuración llamando a System.setProperty ("myProperty", "fakeValue")? Son valores super globales mutables. – German

+0

Esta es la mejor respuesta para nuestra situación, si vamos a seguir esta ruta. Estamos utilizando un sistema de almacenamiento de configuración, pero necesitamos el entorno establecido entre los diferentes servidores de Glassfish. Queremos que el mismo archivo de guerra funcione en cualquiera de nuestros servidores de glassfish, por lo que excluir el entorno actual (local, desarrollo, producción, etc.) de la guerra es nuestro objetivo, así que sabemos qué configuración obtener del almacenamiento de configuración. Alternativamente, estábamos pensando en almacenar en el almacenamiento config y verificar el entorno basado en el servidor, y de forma predeterminada en local. Cualquier otra idea sería apreciada también. – adpro

2

poner el código siguiente en el método de contextInitialized ServletContextListener:

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

Esto se lee de application.properties de la carpeta WEB-INF de su aplicación web cuando se inicia. Esto requerirá un reinicio cada vez que cambien las configuraciones, pero en mi opinión, eso es lo que debería ser.

Cuestiones relacionadas