`
wander312
  • 浏览: 213478 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ibatis的cacheModel配置不满足"(flushInterval?,flushOnExecute*,property*)+"约束

 
阅读更多
给ibatis加cache时, 碰到一直报"The content of element type "cacheModel" must match "(flushInterval?,flushOnExecute*,property*)+". " 这个异常. 查了头天, 自己的格式完全符合, 最后把这些文件找出来单独验证. 我的XML:

card.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "\bin\validateXML\sql-map.dtd">
<sqlMap namespace="card">
 	<cacheModel id="product-cache" type="LRU">
		<flushInterval hours="24"/>
	  <flushOnExecute statement="insertProduct"/>
		<flushOnExecute statement="updateProduct"/>
		<flushOnExecute statement="deleteProduct"/>
		<property name="size" value="1000" />
	</cacheModel>
	

</sqlMap>

sql-map.dtd的cacheModel部分:
<!ELEMENT cacheModel (flushInterval?, flushOnExecute*, property*)+>
<!ATTLIST cacheModel
id CDATA #REQUIRED
type CDATA #REQUIRED
readOnly (true | false) #IMPLIED
serialize (true | false) #IMPLIED
>

使用验证程序:
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

public class ValidateXMLDTD {
    
    public static void main(String[] args) {
        testXML();
    }
    
    public static void testXML() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(ValidateXMLDTD.class.getResourceAsStream("card.xml"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
}


其中sql-map.dtd给的example:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "\bin\validateXML\sql-map.dtd">
<sqlMap namespace="card">
 	<cacheModel id="product-cache" type="LRU">
		<flushInterval hours="24"/>
		<flushOnExecute statement="insertProduct"/>
		<flushOnExecute statement="updateProduct"/>
		<flushOnExecute statement="deleteProduct"/>
		<property name="size" value="1000" />
	</cacheModel>
</sqlMap>


在内容上无论怎么比较都一样, 最后一句一句的替换, 看到底错在哪句上面, 还是会报错, 最终只感觉内容完全一样, 只是不美观, 格式化一下, 再测试, 发现没有错, 原来是自的XML的flushOnExecute前多了一个空格, dtd给出"(flushInterval?, flushOnExecute*, property*)+" 这种约束时元素中间不能出现空格, 但可以使用制表符, 当dtd给出"(#PCDATA | include | dynamic | iterate)"约束时, 元素中间既可以是空格, 也可以是制表符.

删除空格, 使用tab键, 大功告成.....
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics