TERASOLUNAs JdbcCodeList
ist eine Funktion, die die Ergebnisse von SQL-Suchen aus der Datenbank als Codeliste registriert, und ich denke, sie wird häufig verwendet.
Es ist keine große Sache mit ein oder zwei Codelisten, aber wenn die Anzahl der Codelisten Hunderte von Klassen erreicht, wird die Zeit, die für den Start benötigt wird, unerträglich.
Also fragte ich mich, ob ich mehrere Codelisten gleichzeitig bei "UNION ALL" registrieren könnte, wie unten gezeigt.
SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_ORDERSTATUS'
UNION ALL
SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_HOGE'
ORDER BY code_bean_name, code_id
Da die Codeliste 1 Codeliste und 1 Bean-Definition enthält, muss die Bean-Definition dynamisch hinzugefügt werden, um mehrere Codelisten zu registrieren. Wenn Sie eine Implementierungsklasse für die Schnittstelle "org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor" erstellen, können Sie anscheinend Beans dynamisch hinzufügen. Wenn Sie über die Implementierungsklasse dieses "BeanDefinitionRegistryPostProcessor" auf die Datenbank zugreifen und die Bean der Codeliste registrieren, können Sie tun, was Sie wollen.
Wenn ich es jedoch tatsächlich ausführe, ist der DB-Zugriff nicht gut. Zu dem Zeitpunkt, an dem "BeanDefinitionRegistryPostProcessor" funktioniert, scheinen Platzhalter wie "$ {hogehoge}" der Bean-Definition nicht aufgelöst zu sein, und die Zeichenfolge vor der DB-Verbindungszeichenfolge usw. wird in der Eigenschaft ("$" festgelegt {hogehoge} `selbst) wurde genommen und es scheint, dass ich mich nicht gut verbinden kann. Wenn Sie in der DataSource-Definition keine Platzhalter verwenden und die Verbindungszeichenfolge usw. direkt in der Bean-Definition beschreiben, können Sie eine DB-Verbindung herstellen, aber das direkte Schreiben in XML ist nicht gut.
Daher habe ich es aufgegeben, nur die Implementierungsklasse von "BeanDefinitionRegistryPostProcessor" abzuschließen, und sie in zwei Stufen unterteilt.
Die Implementierungsklasse BeanDefinitionRegistryPostProcessor
definiert nur die Bean-Definitionen in der erforderlichen Codeliste. (Der Inhalt der Codeliste ist jedoch leer.)
Greifen Sie mit einer anderen Klasse "@ PostConstruct" auf die Datenbank zu und legen Sie die Wertezuordnung in der leeren Codeliste fest.
Das Implementierungsimage ist wie folgt.
CustomBeanDefinitionRegistryPostProcessor.java
/**
*
*/
package xxxxxx.yyyyyy.zzzzzz.app.welcome;
import java.util.List;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.terasoluna.gfw.common.codelist.SimpleMapCodeList;
/**
* @author toshio
*
*/
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
private List<String> codeListNames;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
if (codeListNames != null) {
for (String codeBeanName : codeListNames) {
BeanDefinition beanDefinition = new RootBeanDefinition(SimpleMapCodeList.class);
registry.registerBeanDefinition(codeBeanName, beanDefinition);
}
}
}
/**
* @param codeListNames set codeListNames
*/
public void setCodeListNames(List<String> codeListNames) {
this.codeListNames = codeListNames;
}
}
CustomCodeListLoader.java
/**
*
*/
package xxxxxx.yyyyyy.zzzzzz.app.welcome;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.terasoluna.gfw.common.codelist.SimpleMapCodeList;
/**
* @author toshio
*
*/
public class CustomCodeListLoader {
/**
* Database access information
*/
private JdbcTemplate jdbcTemplate;
@Autowired
private ApplicationContext applicationContext;
/**
* SQL Query to access the database
*/
private String querySql;
private List<String> codeListNames;
/**
*
*/
private String codeNameColumn;
/**
* property that holds the name of the column of the database holding the value part of the codelist
*/
private String valueColumn;
/**
* property that holds the name of the column of the database holding the label part of the codelist
*/
private String labelColumn;
@PostConstruct
public void afterPropertiesSet() {
Map<String, Map<String, String>> allMap = new HashMap<String, Map<String, String>>();
for (String codeName : codeListNames) {
allMap.put(codeName, new LinkedHashMap<String, String>());
}
List<Map<String, Object>> rows = jdbcTemplate.queryForList(querySql);
for (Map<String, Object> row : rows) {
Object codeName = row.get(codeNameColumn);
Object key = row.get(valueColumn);
Object value = row.get(labelColumn);
if (codeName != null && key != null && value != null) {
Map<String, String> map = allMap.get(codeName.toString());
if (map == null) {
map = new LinkedHashMap<String, String>();
}
map.put(key.toString(), value.toString());
allMap.put(codeName.toString(), map);
}
}
for (Entry<String, Map<String, String>> codeEnt : allMap.entrySet()) {
Object codeBean = applicationContext.getBean(codeEnt.getKey());
if (codeBean instanceof SimpleMapCodeList) {
SimpleMapCodeList smc = (SimpleMapCodeList) codeBean;
smc.setMap(codeEnt.getValue());
}
}
}
/**
* Sets JdbcTemplate
* @param jdbcTemplate JdbcTemplate instance for fetching code list records
*/
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* Setter method for labelColumn
* @param labelColumn column name for fetch a code label
*/
public void setLabelColumn(String labelColumn) {
this.labelColumn = labelColumn;
}
/**
* Setter method for valueColumn
* @param valueColumn column name for fetch code value
*/
public void setValueColumn(String valueColumn) {
this.valueColumn = valueColumn;
}
/**
* Setter method for querySql
* @param querySql sql for fetching code list records from database
*/
public void setQuerySql(String querySql) {
this.querySql = querySql;
}
public void setCodeNameColumn(String codeNameColumn) {
this.codeNameColumn = codeNameColumn;
}
/**
* @param codeListNames set codeListNames
*/
public void setCodeListNames(List<String> codeListNames) {
this.codeListNames = codeListNames;
}
}
projectName-codelist.xml
<bean class="xxxxxx.yyyyyy.zzzzzz.app.welcome.CustomBeanDefinitionRegistryPostProcessor">
<property name="codeListNames">
<list>
<value>CL_ORDERSTATUS</value>
<value>CL_HOGE</value>
</list>
</property>
</bean>
<bean class="xxxxxx.yyyyyy.zzzzzz.app.welcome.CustomCodeListLoader">
<property name="querySql">
<value>
SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_ORDERSTATUS'
UNION ALL
SELECT code_bean_name, code_id, code_name FROM t_sample_codes WHERE code_bean_name = 'CL_HOGE'
ORDER BY code_bean_name, code_id
</value>
</property>
<property name="codeNameColumn" value="code_bean_name"/>
<property name="valueColumn" value="code_id" />
<property name="labelColumn" value="code_name" />
<property name="jdbcTemplate" ref="jdbcTemplateForCodeList" />
<property name="codeListNames">
<list>
<value>CL_ORDERSTATUS</value>
<value>CL_HOGE</value>
</list>
</property>
</bean>
CREATE TABLE t_sample_codes (
code_bean_name varchar(32) not null,
code_id varchar(32) not null,
code_name varchar(256) not null,
primary key (code_bean_name, code_id)
);
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_ORDERSTATUS', '1', 'Received');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_ORDERSTATUS', '2', 'Sent');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_ORDERSTATUS', '3', 'Cancelled');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_HOGE', '1', 'hoge');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_HOGE', '2', 'hogehoge');
INSERT INTO t_sample_codes(code_bean_name, code_id, code_name) VALUES ('CL_HOGE', '3', 'hogehogehoge');
commit;
Recommended Posts