解决方案是实现一个自己的自定义映射器。这里是一个内存实现单例类,它一次读取所有配置,然后按名称提供键 ID。
/**
* This is an memory implementation of singleton mapper class which contains ISO8583
* field mappings as Key Value pairs [Field Name,Field Value]
* in order
*
* Created on 12/16/2014.
*/
public class ISO8583MapperFactory {
private static Logger logger= Logger.getLogger(ISO8583MapperFactory.class);
private static ISO8583MapperFactory instance = null;
private static HashMap<String,Integer> fieldMapper=null;
/**
*
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
private ISO8583MapperFactory() throws IOException, SAXException, ParserConfigurationException {
fieldMapper =new HashMap<String, Integer>();
mapFields();
}
/**
*
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
private void mapFields() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
dBuilder.setEntityResolver(new GenericPackager.GenericEntityResolver());
//InputStream in = new FileInputStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);
InputStream in = getClass().getClassLoader().getResourceAsStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);
Document doc = dBuilder.parse(in);
logger.info("Root element :" + doc.getDocumentElement().getNodeName());
if (doc.hasChildNodes()) {
loadNodes(doc.getChildNodes(), fieldMapper);
}
}
/**
*
* @return
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
public static ISO8583MapperFactory getInstance()
throws ParserConfigurationException, SAXException, IOException {
if(instance==null){
instance=new ISO8583MapperFactory();
}
return instance;
}
/**
*
* @param fieldName
* @return
*/
public Integer getFieldidByName(String fieldName){
return fieldMapper.get(fieldName);
}
/**
* Recursive method to read all the id and field name mappings
* @param nodeList
* @param fieldMapper
*/
protected void loadNodes(NodeList nodeList,HashMap<String,Integer> fieldMapper) {
logger.info(" Invoked loadNodes(NodeList nodeList,HashMap<String,Integer> fieldMapper)");
for (int count = 0; count < nodeList.getLength(); count++) {
Node tempNode = nodeList.item(count);
// make sure it's element node.
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
// get node name and value
logger.info("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
logger.info("Node Value =" + tempNode.getTextContent());
if (tempNode.hasAttributes()) {
// get attributes names and values
NamedNodeMap nodeMap = tempNode.getAttributes();
fieldMapper.put(nodeMap.getNamedItem(ISO8583Constant.FIELD_NAME).getNodeValue(),Integer.valueOf( nodeMap.getNamedItem(ISO8583Constant.FIELD_ID).getNodeValue()));
}
if (tempNode.hasChildNodes()) {
// loop again if has child nodes
loadNodes(tempNode.getChildNodes(), fieldMapper);
}
logger.info("Node Name =" + tempNode.getNodeName() + " [CLOSE]");
}
}
}
/**
*
* @return
*/
public static HashMap<String, Integer> getFieldMapper() {
return fieldMapper;
}
/**
*
* @param fieldMapper
*/
public static void setFieldMapper(HashMap<String, Integer> fieldMapper) {
ISO8583MapperFactory.fieldMapper = fieldMapper;
}
}
例子
public static void main(String[] args) throws IOException, ISOException, InterruptedException {
try {
ISO8583MapperFactory.getInstance().getFieldidByName("NAME");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}