XML 1.1을 사용하면 1.0에서는 사용할 수 없던 제어문자를 어트리뷰트 값으로 사용할 수 있기 때문에, XML1.1로 변경하는 작업을 최근 진행했다. 그러자 이상하게도 간헐적으로 EMF가 모델을 XML로 부터 읽어들이지 못하는 문제가 발생했다.

주요 증세

  • PackageNotFound 예외
  • 패키지 URI가 널일 수 없다는 예외
  • 이상한 명칭의 EClass 를 찾지 못했다는 예외

원인

사실 이 문제가 XML 버전과 연관이 있다는 사실을 알아내는데만도 반나절 이상의 시간을 소비해야 했다.

문제는 JVM에 기본 포함된 저시스 SAX파서가 XML 1.1의 경우 몇몇 어트리뷰트를 토큰 레벨에서 부터 제대로 스캔하지 못하는 경우가 발생했기 때문이었다. 이로인해 EMF XML 계층에 잘못된 Sax Event가 전달되어, 그 중에서도 xsi:type 어트리뷰트 값이 엉뚱한 값이 들어가 타입명으로 부터 EClass를 찾지 못하거나, 어트리뷰트 값으로 부터 패키지 URI를 파싱하지 못해 문제가 발생한다.

이 문제는 EMF의 XMLLoadImpl을 개인화 하여, 파서를 교체하여 해결 할 수 있다. 필자의 경우, 문제를 해결하기 위해 저시스 2.11 (XML 1.1스키마용 베타) 버전을 다운 받아 빌드 패스에 넣고, 아래와 같이 XMLLoadImpl을 개인화하여 문제를 수정했다.

수정 코드:

public class MyXMLLoadImpl extends XMILoadImpl {
	@Override
	protected SAXParser makeParser() throws 
		ParserConfigurationException, SAXException {
		SAXParserFactory f = 
			SAXParserFactory.newInstance(
				SAXParserFactoryImpl.class.getCanonicalName(), 
				getClass().getClassLoader()
			);
		return f.newSAXParser();
	}
}

EMF 로딩 커스터마이징 하기도 함께 읽어 보세요.

'EMF' 카테고리의 다른 글

How to Customize EMF Loading  (0) 2010.09.27
EMF 트랜잭션 관리  (0) 2009.06.08
Posted by 지이이이율
,