čtvrtek 23. dubna 2009

PropertyPlaceholderConfigurer - jak na property v aplikačním kontextu

Ve springu v modulu beans je velice šikovná třída org.springframework.beans.factory.config.PropertyPlaceholderConfigurer. Umí z property filu podle klíče vložit hodnotu do aplikačního kontextu.

Použití v javadocu springu -> PropertyPlaceholderConfigurer.

Díky za reakci :)
Definice beany by vypadala následovně:

<bean id="localPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="locations">
<list>
<value>cfg/localContext.properties</value>
</list>
</property>
</bean>

Nyní kdekoliv v kontextu se řetězec ${...} nahradí hodnotou z property souboru.

středa 22. dubna 2009

Systémové datum pomocí hibernate dialectu

Na našem projektu jsme potřebovali mechanismus, který by zjišťoval systémové datum. Pro každou db jsme implementovali třídu, kde byl natvrdo napsán JDBC select. Kupříkladu, v Oraclu "select sysdate from dual", pro MSSQL byla obdoba "select getdate()". Nakonec se ukázalo daleko příjemnějším řešením hibernate dialect.

Hibernatu musíte dát vědět, s jakou db má tu čest a to tak, že mu docpete konkrétní dialect. Hlavní předek je abstraktní třída
org.hibernate.dialect.Dialect. Obsahuje metodu getCurrentTimestampSelectString(), kterou implementují konkrétní dialecty. V této metodě se nachází náš hledaný JDBC select.

Teď k samotnému řešení.


public Calendar getSysDate() {
Calendar sysDate = Calendar.getInstance();
if (sessionFactory instanceof SessionFactoryImplementor) {
Session session = SessionFactoryUtils.getNewSession(sessionFactory);
Dialect dialect = ((SessionFactoryImplementor) sessionFactory).getDialect();
String queryString;
try {
queryString = dialect.getCurrentTimestampSelectString();
} catch (UnsupportedOperationException un) {
return sysDate;
}
Query query = session.createSQLQuery(queryString);
Object result = query.uniqueResult();
if (result != null && result instanceof Date) {
sysDate.setTime((Date) result);
}
}
return sysDate;
}

V případě, že pro daný dialect není přepsána metoda
getCurrentTimestampSelectString(), vyhodí se vyjímka UnsupportedOperationException a metoda getSysDate() vrací Calendar.getInstance(). Určitě by jste to tak neměli nechat a měli by jste si přepsat váš potřebný dialect a implementovat výše uvedenou metodu :).