Esencialmente tiene un JAR terminado que desea colocar en otro entorno, y sin ninguna modificación ha recogido las propiedades adecuadas en tiempo de ejecución. Si eso es correcto, entonces los siguientes enfoques son válidos:
1) Confíe en la presencia de un archivo de propiedades en el directorio de inicio del usuario.
Configurar el PropertyPlaceholderConfigurer para hacer referencia a un archivo de propiedades externo al JAR como esto:
<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false"/>
<property name="order" value="1"/>
<property name="locations">
<list>
<!-- User home holds secured information -->
<value>file:${user.home}/MyApp/application.properties</value>
</list>
</property>
</bean>
el sistema operativo asegurar el contenido del archivo application.properties para que sólo las personas adecuadas pueden tener acceso a ella . Como este archivo no existe cuando primero ejecuta la aplicación, cree un script simple que interrogará al usuario sobre los valores críticos (por ejemplo, nombre de usuario, contraseña, dialecto Hibernate, etc.) al inicio. Proporcione una amplia ayuda y valores predeterminados razonables para la interfaz de línea de comando.
2) Si su aplicación está en un entorno controlado para que se pueda ver una base de datos, entonces el problema puede reducirse a crear credenciales básicas utilizando la técnica 1) anterior para conectarse a la base de datos durante el inicio del contexto y luego sustitución utilizando valores leídos a través de JDBC. Necesitará un enfoque de dos fases para el inicio de la aplicación: la fase 1 invoca un contexto padre con el archivo application.properties rellenando una JdbcTemplate y el DataSource asociado; la fase 2 invoca el contexto principal que hace referencia al padre para que JdbcTemplate se pueda usar como se configuró en el JdbcPropertyPlaceholderConfigurer.
Un ejemplo de este tipo de código sería el siguiente:
public class JdbcPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private Logger log = Logger.getLogger(JdbcPropertyPlaceholderConfigurer.class);
private JdbcTemplate jdbcTemplate;
private String nameColumn;
private String valueColumn;
private String propertiesTable;
/**
* Provide a different prefix
*/
public JdbcPropertyPlaceholderConfigurer() {
super();
setPlaceholderPrefix("#{");
}
@Override
protected void loadProperties(final Properties props) throws IOException {
if (null == props) {
throw new IOException("No properties passed by Spring framework - cannot proceed");
}
String sql = String.format("select %s, %s from %s", nameColumn, valueColumn, propertiesTable);
log.info("Reading configuration properties from database");
try {
jdbcTemplate.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
String name = rs.getString(nameColumn);
String value = rs.getString(valueColumn);
if (null == name || null == value) {
throw new SQLException("Configuration database contains empty data. Name='" + name + "' Value='" + value + "'");
}
props.setProperty(name, value);
}
});
} catch (Exception e) {
log.fatal("There is an error in either 'application.properties' or the configuration database.");
throw new IOException(e);
}
if (props.size() == 0) {
log.fatal("The configuration database could not be reached or does not contain any properties in '" + propertiesTable + "'");
}
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void setNameColumn(String nameColumn) {
this.nameColumn = nameColumn;
}
public void setValueColumn(String valueColumn) {
this.valueColumn = valueColumn;
}
public void setPropertiesTable(String propertiesTable) {
this.propertiesTable = propertiesTable;
}
}
lo anterior, entonces se configuraría en la primavera siguiente (tenga en cuenta la propiedad de orden se produce después de los usuales $ marcadores de posición con el prefijo):
<!-- Enable configuration through the JDBC configuration with fall-through to framework.properties -->
<bean id="jdbcProperties" class="org.example.JdbcPropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false"/>
<property name="order" value="2"/>
<property name="nameColumn" value="name"/>
<property name="valueColumn" value="value"/>
<property name="propertiesTable" value="my_properties_table"/>
<property name="jdbcTemplate" ref="configurationJdbcTemplate"/> <!-- Supplied in a parent context -->
</bean>
Esto permitiría el seguimiento que se produzca en la configuración del resorte
<!-- Read from application.properties -->
<property name="username">${username}</property>
...
<!-- Read in from JDBC as part of second pass after all $'s have been fulfilled -->
<property name="central-thing">#{name.key.in.db}</property>
3) Por supuesto, si estás en un contenedor de aplicaciones web, entonces simplemente usas JNDI. Pero no eres así que no puedes.
Espero que esto ayude!
Gracias por la sugerencia de tiempo de compilación, pero no funciona para mi caso. He actualizado mi pregunta para reflejar eso; Quise incluir esa información originalmente y olvidarla. Verificare tu otra sugerencia. – Ickster
Estoy usando Maven como herramienta de compilación. ¿Cómo combinará la configuración correcta al empaquetar en maven? – premcs