2010-05-04 18 views
8

Ho un file applicationContext.xml con il seguente nodo:Come posso rendere obbligatorie le proprietà nei file delle proprietà in primavera?

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

Si specifica che entrambi i file properties saranno utilizzati da parte mia domanda.

All'interno pathConfiguration.properties, alcuni percorsi sono definiti come:

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

Un bean PathConfiguration trovi incastonatori per ciascun percorso.

Il problema è: quando alcuni di questi percorsi obbligatori non sono definiti, non viene generato alcun errore. Come e dove dovrei gestire questo problema?

+0

Quale versione di Spring usi nel tuo progetto? Hai fatto riferimento a una vecchia versione in un commento qui sotto. – stefanglase

+0

Sì, ho dimenticato di menzionare. Spring 2.5 –

risposta

6

Il comportamento standard del PropertyPlaceholder configurato tramite <context:property-placeholder ... /> genera un'eccezione quando una proprietà non può essere risolta una volta che è richiesta in qualche posto, purché non la configuri diversamente.

Per il tuo caso se hai un bean che richiede alcune proprietà come questa, fallirà quando il valore non può essere risolto. Ad esempio come questo:

public class PropertiesAwareBean { 

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

    String getErrorPath() { 
    return errorPath; 
    } 

} 

Se si vuole rilassare il PropertyPlaceholder e non ce la fai un'eccezione quando una proprietà non può essere risolto è possibile configurare il PropertyPlaceholder di ignorare le proprietà irrisolvibili come questo <context:property-placeholder ignore-unresolvable="true" ... />.

0

Non sono sicuro di comprendere appieno il problema, ma probabilmente ci sono vari modi per approcciare questo problema. Uno sarebbe rendere i percorsi obbligatori utilizzando l'iniezione del costruttore. Nel costruttore è possibile quindi convalidare i valori in arrivo e, se null, ad esempio, lanciare istanze BeanInitializationException.

+0

Penso che tu abbia capito il problema :-) In effetti sono completamente nuovo in Spring e non riesco a capire come implementare l'iniezione del costruttore. Ne parlerò un po 'e se questa è la soluzione tornerò qui per darti +1. (Se è possibile aggiornare la risposta con un esempio, sarebbe fantastico) –

+0

... penso di aver trovato la soluzione qui: http://static.springsource.org/spring/docs/2.0.3/reference/beans.html # beans-factory-properties-detailed (item 3.5.1.2.1). E 'questo che intendevi? –

+0

Sì, questo è quello che stavo pensando. Non ho un esempio su di me. Ma la cosa da notare è che il vantaggio di iniettore del costruttore è che puoi assicurarti che i parametri richiesti siano passati. Ma ricorda che non garantisce che siano corretti. È possibile continuare a convalidare i valori delle proprietà all'interno del costruttore e lanciare BeanInitializationException se non sono corretti. – drekka

1

Un modo per rafforzare la verifica dei parametri è passare a un classico bean PropertyPlaceholderConfigurer nel file bean.

Il PropertyPlaceholderConfigurer ha proprietà che è possibile utilizzare per modificare il suo comportamento e specificare viene generata un'eccezione o meno se qualche chiave manca (dare un'occhiata a setIgnoreUnresolvablePlaceholders o setIgnoreResourceNotFound).

Se ricordo correttamente, in Spring 2.5, solo l'attributo di posizione è supportato per <context:property-placeholder> (le cose potrebbero essere cambiate però).

+0

Sei corretto per Spring 2.5 c'è solo un 'location' e un attributo' properties-ref'. Primavera 3.0 offre più possibilità di configurazione su '' -Tag come menzionato nella mia risposta. – stefanglase

Problemi correlati