2010-05-04 20 views
8

Tengo un archivo applicationContext.xml con el nodo siguiente:¿Cómo puedo hacer que las propiedades de los archivos de propiedades sean obligatorias en Spring?

<context:property-placeholder 
location="classpath:hibernate.properties, classpath:pathConfiguration.properties" /> 

Se especifica que ambos properties archivos serán utilizados por mi solicitud.

Dentro pathConfiguration.properties, se definen algunos caminos, tales como:

PATH_ERROR=/xxx/yyy/error 
PATH_SUCCESS=/xxx/yyy/success 

Un grano de PathConfiguration tiene setters para cada ruta.

El problema es que cuando algunas de las rutas obligatorias no están definidas, no se produce ningún error. ¿Cómo y dónde debo manejar este problema?

+0

¿Qué versión de Spring usas en tu proyecto? Hizo referencia a una versión un poco antigua en un comentario a continuación. – stefanglase

+0

Sí, olvidé mencionarlo. Spring 2.5 –

Respuesta

6

El comportamiento estándar del PropertyPlaceholder que se configura mediante <context:property-placeholder ... /> arroja una excepción cuando una propiedad no se puede resolver una vez que se requiere en algún lugar, siempre que no se configure de otra manera.

Para su caso, si tiene un Bean que requiere algunas propiedades como esta, fallará cuando el valor no se pueda resolver. Por ejemplo así:

public class PropertiesAwareBean { 

    @Value("${PATH_ERROR}") 
    private String errorPath; 

    String getErrorPath() { 
    return errorPath; 
    } 

} 

Si desea relajar el PropertyPlaceholder y no lo hacen una excepción cuando una propiedad no puede ser resuelta puede configurar el PropertyPlaceholder hacer caso omiso de las propiedades que no tienen solución como esta <context:property-placeholder ignore-unresolvable="true" ... />.

0

No estoy seguro si entiendo completamente su problema, pero probablemente haya una variedad de maneras de abordar esto. Una sería hacer las rutas obligatorias mediante el uso de inyección de constructor. En el constructor, puede validar los valores entrantes y, si es nulo, lanzar instancias de BeanInitializationException.

+0

Creo que entendiste el problema :-) De hecho, soy completamente nuevo en Spring y no puedo descubrir cómo implementar la inyección de constructor. Voy a leer algo al respecto y si esta es la solución, volveré aquí para darte un +1. (Si puede actualizar su respuesta con un ejemplo, sería genial) –

+0

... creo que encontré la solución aquí: http://static.springsource.org/spring/docs/2.0.3/reference/beans.html # beans-factory-properties-detailed (elemento 3.5.1.2.1). ¿Es eso lo que querías decir? –

+0

Sí, eso es en lo que estaba pensando. No tengo un ejemplo sobre mí. Pero lo que hay que destacar es que el beneficio de la inyección del constructor es que puede garantizar que se pasen los parámetros necesarios. Pero recuerde que eso no garantiza que sean correctos. Es posible que aún desee validar los valores de propiedad dentro del constructor y lanzar una BeanInitializationException si no son correctos. – drekka

1

Una forma de reforzar la verificación de parámetros es cambiar a un bean clásico PropertyPlaceholderConfigurer en el archivo beans.

El PropertyPlaceholderConfigurer tiene propiedades que se pueden utilizar para modificar su comportamiento y especificar produce una excepción o no, si alguna clave que falta (echar un vistazo a setIgnoreUnresolvablePlaceholders o setIgnoreResourceNotFound).

Si mal no recuerdo, en Spring 2.5, solo el atributo de ubicación es compatible con <context:property-placeholder> (aunque las cosas podrían haber cambiado).

+0

Está en lo correcto para Spring 2.5 solo hay una 'ubicación' y un atributo' properties-ref'. Primavera 3.0 ofrece más posibilidades de configuración en '' -Tag como se menciona en mi respuesta. – stefanglase

Cuestiones relacionadas