1
2
3
|
org.dom4j.DocumentException: XXXXXXX
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2211)
|
1
2
3
|
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
|
1
2
|
Document document = xmlHelper.createSAXReader( resourceName, errors, entityResolver ).read( new InputSource( stream ) );
doConfigure( document );
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public SAXReader createSAXReader(String file, List errorsList, EntityResolver entityResolver) {
SAXReader saxReader = resolveSAXReader();
saxReader.setEntityResolver(entityResolver);
saxReader.setErrorHandler( new ErrorLogger(file, errorsList) );
return saxReader;
}
private SAXReader resolveSAXReader() {
if ( saxReader == null ) {
saxReader = new SAXReader();
saxReader.setMergeAdjacentText( true );
saxReader.setValidation( true );
}
return saxReader;
}
|
1
2
|
然后 XML 阅读器将允许应用程序在包含外部实体之前截取任何外部实体(包括外部 DTD 子集和外部参数实体,如果有)。
许多 SAX 应用程序不需要实现此接口,但对于从数据库或其他特定的输入源中构建 XML 文档的应用程序,或者对于使用 URI 类型(而不是 URL )的应用程序,这特别有用。
|
1 | InputSource resolveEntity(String publicId, String systemId) |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public InputSource resolveEntity(String publicId, String systemId) {
if ( systemId != null ) {
if ( systemId.startsWith( HIBERNATE_NAMESPACE ) ) {
String path = "org/hibernate/" + systemId.substring( HIBERNATE_NAMESPACE.length() );
InputStream dtdStream = resolveInHibernateNamesp
InputSource source = new InputSource( dtdStream );
source.setPublicId( publicId );
source.setSystemId( systemId );
return source;
}
else if ( systemId.startsWith( USER_NAMESPACE ) ) {
String path = systemId.substring( USER_NAMESPACE.length() );
InputStream stream = resolveInLocalNamespace( path );
InputSource source = new InputSource( stream );
source.setPublicId( publicId );
source.setSystemId( systemId );
return source;
}
}
// use default behavior
return null ;
}
|