2009-05-18 17 views
6

Estoy trabajando en un proyecto de Spring 2.0, sin anotaciones. Estamos utilizando varios beans PropertyPlaceholderConfigurer con diferentes pre y sufijos para cargar propiedades de diferentes archivos de propiedades. Esto funciona maravillosamente.Cómo detectar propiedades no utilizadas en Spring

Debido a la gran cantidad de archivos de propiedades y propiedades, quería que la aplicación enumerara las propiedades que son no utilizadas. Eso significa, propiedades que están configuradas en un archivo de propiedades, pero nunca referenciadas en el contexto de la aplicación Spring.

Escribí un bean que implementa BeanFactoryPostProcessor, e hice algunos trucos para encontrar referencias en el contexto de la aplicación a los diferentes PropertyPlaceHolderConfigurers. Esto me da una lista de propiedades que se utilizan.

Sin embargo, no puedo acceder a las propiedades cargadas por los PlaceHolderConfigurers. Por eso, no puedo mostrar las propiedades que NO se usan.

¿Hay una manera (simple) de acceder a las propiedades de un PropertyPlaceholderConfigurer? ¿Alguna otra sugerencia sobre cómo resolver este problema?

Editar: La solución se accede a la metod mergeProperties, así:

PropertyPlaceholderConfigurer ppc = 
    (PropertyPlaceholderConfigurer) applicationContext.getBean("yourBeanId"); 
Method m = PropertiesLoaderSupport.class.getDeclaredMethod("mergeProperties", 
      new Class[] {}); 
m.setAccessible(true); 
Properties loadedProperties = (Properties) m.invoke(propertyPlaceHolder, null); 

Después de conseguir las propiedades cargados originalmente, y traer los beandefinitions durante el BeanFactoryPostProcessing, el resto era simple. Reste las dos colecciones, y listo: ahora podemos enumerar las propiedades no utilizadas.

Respuesta

3

Puede intentar llamar al método protegido mergeProperties utilizando la reflexión para obtener la lista completa de propiedades, y luego, como ya han dicho otros carteles, eliminar todas las propiedades que realmente se utilizan para terminar con el conjunto de sin usar propiedades.

Probablemente un poco demasiado hackish para el código de producción, pero supongo que lo ejecutará solo en una configuración de prueba de unidad para generar este informe.

1

¿Qué le parece crear su propia subclase de PropertyPlaceholderConfigurer que mantenga una referencia al objeto its Properties y proporcione un descriptor de acceso? Su BeanFactoryPostProcessor podría acceder a cada uno de los objetos de propiedades originales y, combinado con la lista de propiedades que se utilizan, podría descubrir las propiedades que no se utilizaron.

+0

Eso requeriría que se editen todos los PropertyPlaceHolderConfigurers, lo cual es posible, pero no quiero hacerlo. Al usar la solución anterior, también puedo detectar las propiedades faltantes en los nuevos PropertyPlaceHolderConfigurers que se agregan por "el chico nuevo" :-) – Rolf

0

¿No podría simplemente iterar sobre la lista de propiedades usadas y eliminarlas de un conjunto duplicado de todas las propiedades? Eso dejaría atrás a los que no se usaron.

+0

No hay getter para las propiedades usadas, y no getter para todas las propiedades. – Rolf

Cuestiones relacionadas