如何在Weblogic中校验及解释XML文件
前些天项目中要用到XML的校验及解释,于是本人写了一个校验器。在本地测试没有问题,但是到了Weblogic 中时,程序出了一点问题,后来找了一些资料才搞定。问题是JAXP方面的。
校验类如下(只有主要代码可能需要调试):
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
public class DefaultParser {
public static final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
public static final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
private static Logger log = Logger.getLogger(DefaultParser.class);
public boolean validate(InputStream in, InputStream schema, ErrorHandle errorHandle)
throws Exception {
log.debug("DefaultParser.validate() begin:");
boolean result = false;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
factory.setAttribute(SCHEMA_LANGUAGE, XML_SCHEMA);
factory.setAttribute(SCHEMA_SOURCE, schema);
DocumentBuilder parser = factory.newDocumentBuilder();
parser.setErrorHandler(errorHandle);
parser.parse(in);
if (errorHandle.getMsgList().size() == 0) {
result = true;
}
log.debug("DefaultParser.validate() result:" + result);
return result;
}
}
以上代码在IDE中调试没有任何问题,也能正确的校验出XML的错误,但程序发布到Weblogic中运行时,出现非法参数错误,主要是因为DocumentBuilderFactory使用了Weblogic自带的实现类。而在本地测试时使用的是xerces中的实现类(org.apache.xerces.jaxp.DocumentBuilderFactoryImpl)。看看DocumentBuilderFactory.newInstance()原代码可以看出默认的实现类应该是Sun的实现类(org.apache.crimson.jaxp.DocumentBuilderFactoryImpl)。所以实现类在不同的环境下是不同的,由于没有搞清楚,如何怎么配置或指定实现类,因此只好直接使用了测试环境下可以运行情况下的类。修改以上代码中的如下行:
DocumentBuilderFactory factory = new org.apache.xerces.jaxp.DocumentBuilderFactoryImpl();
修改后的校验方法如下:
public boolean validate(InputStream in, InputStream schema, ErrorHandle errorHandle)
throws Exception {
log.debug("DefaultParser.validate() begin:");
boolean result = false;
DocumentBuilderFactory factory = new org.apache.xerces.jaxp.DocumentBuilderFactoryImpl();
factory.setNamespaceAware(true);
factory.setValidating(true);
factory.setAttribute(SCHEMA_LANGUAGE, XML_SCHEMA);
factory.setAttribute(SCHEMA_SOURCE, schema);
DocumentBuilder parser = factory.newDocumentBuilder();
parser.setErrorHandler(errorHandle);
parser.parse(in);
if (errorHandle.getMsgList().size() == 0) {
result = true;
}
log.debug("DefaultParser.validate() result:" + result);
return result;
}
我知道有更好的解决方法,希望大家指正。谢谢