JdbcCodeList
de TERASOLUNA est une fonction qui enregistre les résultats des recherches SQL à partir de la base de données sous forme de liste de codes, et je pense qu'elle est souvent utilisée.
Ce n'est pas un gros problème avec une ou deux listes de codes, mais lorsque le nombre de listes de codes atteint des centaines de classes, le temps de démarrage devient insupportable.
Je me suis donc demandé si je pouvais enregistrer plusieurs listes de codes à la fois avec ʻUNION ALL` comme indiqué ci-dessous.
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
Puisque la liste de codes a 1 liste de codes et 1 définition de bean, il est nécessaire d'ajouter dynamiquement la définition de bean afin d'enregistrer plusieurs listes de codes.
ʻOrg.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessorSi vous créez une classe d'implémentation pour l'interface, il semble que vous puissiez ajouter des beans dynamiquement. Si vous accédez à la base de données à partir de la classe d'implémentation de ce
BeanDefinitionRegistryPostProcessor` et enregistrez le Bean de la liste de codes, vous pouvez faire ce que vous voulez.
Cependant, lorsque je l'exécute, l'accès à la base de données n'est pas bon.
Apparemment, au moment où BeanDefinitionRegistryPostProcessor
fonctionne, il semble que les espaces réservés tels que $ {hogehoge} ʻ de la définition de Bean ne sont pas résolus, et la chaîne de caractères avant la chaîne de caractères de connexion à la base de données, etc. est définie à partir de la propriété (
$ {hogehoge} ʻitself) a été prise et il semble que je ne peux pas bien me connecter.
Si vous n'utilisez pas d'espaces réservés dans la définition de DataSource et décrivez la chaîne de caractères de connexion, etc. directement dans la définition de Bean, vous pouvez établir une connexion à la base de données, mais écrire directement en XML n'est pas bon.
Par conséquent, j'ai renoncé à terminer avec uniquement la classe d'implémentation de BeanDefinitionRegistryPostProcessor
et l'ai divisée en deux étapes.
La classe d'implémentation BeanDefinitionRegistryPostProcessor
définit uniquement les définitions de bean dans la liste de codes requise. (Cependant, le contenu de la liste de codes est vide)
Accédez à la base de données avec une autre classe @ PostConstruct
et définissez la table de valeurs dans la liste de codes vide.
L'image d'implémentation est la suivante.
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 définir 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 définir 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;