2016-01-13 21 views
6

Attualmente sto convertendo il xml in java config. Ma ho bloccato una parte della mia ricerca da diversi giorni. Qui il problema:come convertire jndi lookup da xml a java config

Xml config:

 <jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" resource-ref="true" /> 

    <beans:bean id="jdbcTemplate" 
    class="org.springframework.jdbc.core.JdbcTemplate" > 
    <beans:property name="dataSource" ref="dbDataSource"></beans:property> 
    </beans:bean> 

Finora sono riuscito a convertire questo codice:

<jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" resource-ref="true" />

a questo:

@Bean(name = "dbDataSource") 
public JndiObjectFactoryBean dataSource() { 
    JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 
    bean.setJndiName("${db.jndi}"); 
    bean.setResourceRef(true); 
    return bean; 
} 

E questo:

 <beans:bean id="jdbcTemplate" 
    class="org.springframework.jdbc.core.JdbcTemplate" > 
    <beans:property name="dataSource" ref="dbDataSource"></beans:property> 
    </beans:bean> 

a questo:

@Bean(name = "jdbcTemplate") 
public JdbcTemplate jdbcTemplate() { 
    JdbcTemplate jt = new JdbcTemplate(); 
    jt.setDataSource(dataSource); 
    return jt; 
    } 

Il problema è il metodo setDataSource() oggetto DataSource bisogno, ma io non sono sicuro di come mettere in relazione sia bean.How per passare il JndiObjectFactoryBean a DataSource?

Oppure è necessario utilizzare un altro metodo?

Domanda extra:

Il bean.setJndiName("${db.jndi}"), $ {} db.jndi si riferiscono alle proprietà del file, ma ho sempre avuto NameNotFoundException, Come farlo funzionare?

Grazie !!

risposta

12

Invece di JndiObjectFactoryBean utilizzare un JndiDataSourceLookup invece. Per utilizzare il metodo ${db.jndi} nel dichiarare un argomento del metodo e annotarlo con @Value.

@Bean(name = "dbDataSource") 
public DataSource dataSource(@Value("${db.jndi}" String jndiName) { 
    JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
    return lookup.getDataSource(jndiName); 
} 

metodi e costruttori Autowired possono anche utilizzare il @Value annotazione. - Guida di riferimento della primavera.

@Bean i metodi sono fondamentalmente metodi di fabbrica che sono anche metodi di cablaggio automatico e come tali rientrano in questa categoria.

nel metodo di fabbrica per il JdbcTemplate si può semplicemente utilizzare un argomento DataSource metodo per ottenere un riferimento all'origine dati (se si dispone di più è possibile utilizzare il @Qualifier sull'argomento metodo per specificare quale si desidera utilizzare).

@Bean 
public JdbcTemplate jdbcTemplate(DataSource ds) { 
    return new JdbcTemplate(ds); 
} 
+0

grazie sta lavorando, ma hanno bisogno di aggiungere stringa dopo '@value ("$ {} db.jndi"' – FreezY

+1

tipizzati dalla mia testa, perso il 'STRING', fissato ora. –