XSD를 사용하여 Mybatis의 SqlMapper 프로필을 검증하는 방법(2)

4072 단어 mybatissqlmapper
지난 문장에서 모두에게 소개하였다XSD를 사용하여 Mybatis의 SqlMapper 프로필을 검증하는 방법 (1), 필요한 친구는 참고하세요.
XSD 파일을 작성한 다음 XSD 파일 검사를 어떻게 사용하는지 보고 SqlMapper 파일을 해석합니다. 즉, doParseSqlMapper Resource WithSchema () 방법을 실현하는 것입니다.
이 기능을 구현하기 위해서는 다음과 같은 두 가지 기본 요구 사항이 있습니다.
(1) 호환성: mybatis의 원생 설정을 호환해야 한다. 호환성은 두 가지 등급이 있는데 하나는 DTD 검사를 사용하는 것이다. 이 앞에서 말했듯이 원래의 절차를 밟으면 호환성에 문제가 없다.다른 하나는 XSD 검사를 하는 것이지만 mybatis 원본 설정을 호환해야 한다. 이런 호환성은 위에서 수정한 XSD 파일에서 보증하고 다른 한편으로는 XML의 해석에서 보증해야 한다.
(2) 확장성: 수정의 목적은 확장성을 위한 것이기 때문에 확장성도 기본적인 요구이다.그러나 확장성은 임의성이 아니라 규범에 따라 확장해야 한다. 이 규범은 사용자 정의 XSD 파일이다.
이 두 가지 기본 요구 사항에 도달하기 위해 다음은 저의 생각입니다. 주로 Spring의 사용자 정의 명칭 공간을 참고하십시오.
1. "classpath*: */dysd-*-namespaces.ini"와 같은 클래스 경로에서 지정한 모드의 프로필을 읽는 EntityResolver를 만듭니다.
2. ini 파일에서 다음과 같은 네임스페이스 메타 정보를 정의합니다.
섹션의 이름으로 이름 공간을 사용합니다. 아래의 schema,parser는 각각 이름 공간의 xsd 파일과 해상도 구현 클래스를 표시합니다. 그러면 XML의 XSD 이름 공간에 따라 검사 파일을 찾을 수 있고 해석 입구가 있습니다.
설명:
apache의commons-configuration은ini 형식 파일의 읽기 API를 제공합니다
스프링에서 META-INF/spring을 사용합니다.schemas 및 META-INF/spring.handlers는 XSD 파일과 해상도 구현 클래스를 저장합니다. 여기는 ini 파일 집중 설정을 사용하도록 수정했습니다.
모든 클래스 경로에서 어댑터를 충족시키는 ini 파일을 읽기 때문에 다른 이름 공간을 간단하게 확장할 수 있습니다. 자바에서 XSD를 어떻게 사용해서 검사하는지 자세히 설명하지 않겠습니다.
나는 XML의 해석을 상하문, 해석기, 피해석 파일의 세 가지 요소로 분해했다.doParseSqlMapper ResourceWithSchema() 방법도 간단합니다.

protected void doParseSqlMapperResourceWithSchema(Configuration configuration, Resource mapperLocation){
ISqlMapperParserContext context = new SqlMapperParserContext(configuration);
XmlParserUtils.parseXml(context, mapperLocation);
}
해상도 인터페이스는 다음과 같습니다.

public interface IParser<E extends IParserContext> {
public void parse(E parserContext, String location);
public void parse(E parserContext, String[] locationPatterns);
public void parse(E parserContext, InputStream inputStream);
public void parse(E parserContext, Resource resource);
}
해석 컨텍스트와 해석기 구현 클래스는 다음과 같은 세 가지 레벨로 나뉩니다.
(1) 공통 해석 컨텍스트:

public interface IParserContext { 
public ProblemReporter getProblemReporter();
public EventListener getEventListener();
public SourceExtractor getSourceExtractor();
public Environment getEnvironment();
}
상응하는 등급의 해상도 구현 클래스는 주로 해석된 파일을 불러오는 것을 책임진다(예를 들어 문자열 어댑터를 Resource 대상 집합으로 불러오는 것). 중복 해석하지 않고 병행 실행할 수 있도록 보증한다.
(2) XML 분석 컨텍스트

public interface IXmlParserContext extends IParserContext{
public boolean isNamespaceAware(); 
public DocumentLoader getDocumentLoader();
public EntityResolver getEntityResolver();
public ErrorHandler getErrorHandler();
public XmlParserDelegate getDelegate();
}
해당 레벨의 해석기 구현 클래스는 주로 Resource를 Document 대상으로 변환하고 변환하는 과정에서 검증하는 것을 책임진다.
(3) SqlMapper 분석 컨텍스트

public interface ISqlMapperParserContext extends IXmlParserContext{
public Configuration getConfiguration();
}
해당 레벨의 해상도 구현 클래스는 루트 요소가 있는 이름 공간의 해상도를 찾고 해상도를 사용하여 Document를 해석합니다.
최종적으로, 해석을 ini 프로필에 의뢰한 SchemaSqlMapperNamespaceParser 클래스에 의뢰하지만, 이 클래스는 텍스트 파일에 설정해야 하기 때문에 파라미터가 있는 구조 함수가 불편하기 때문에 SchemaSqlMapperParserDelegate에 의뢰합니다.

public class SchemaSqlMapperNamespaceParser implements INamespaceParser<ISqlMapperParserContext> {
@Override
public void init() {
}
@Override
public void parse(ISqlMapperParserContext parserContext, Document document, Resource resource) {
SchemaSqlMapperParserDelegate delegate = new SchemaSqlMapperParserDelegate(parserContext, document, resource);
delegate.parse();
}
@Override
public void destory() {
}
}
이로써 XSD 검사가 완료되었고 XML 해석 입구를 찾았습니다. 다음은 SchemaSqlMapper ParserDelegate에서 진정한 해석입니다.
위에서 설명한 것은 XSD를 사용하여 Mybatis의 SqlMapper 프로필을 검사하는 방법(2)을 소개합니다. 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기