2012-07-06 3 views
1

Spring-namespaces을 사용하면 스프링 빈을 구성하는 방법을 직접 정의 할 수 있습니다. 아주 멋지다.springs.schemas의 스프링 네임 스페이스와 자리 표시 자

나는 제 3 자 소프트웨어의 spring.schemas에서 다음 (간체 아래 예)를 정의 (Assentis Docbase의)

http\://com.apress.prospring2/ch07/custom.xsd=custDir:/custom.xsd 

의 의미를 사용해야합니다 : 사용자는 schema-와의 스프링 XML로 정의하는 경우 location : "http : //com.apress.prospring2/ch07/custom.xsd"spring은 custom.xsd에 대해이 파일의 유효성을 검사합니다.

custDir은 제공된 jar 바깥 쪽 디렉토리입니다. junit 테스트 중에이 custDir을 올바른 경로를 가리 키도록 설정할 수있는 사람이 있습니까? 이미 시도했는데 -DcustDir =/pathToXsd /하지만 작동하지 않았습니다.

custDir을 제거하면 예상했던대로 작동하지만 제 3 자 소프트웨어이므로 제공된 spring.schemas에서 제거 할 수 없습니다.

어쩌면 이것이 자바에서 속성 파일을 처리하는 방법에 대한 문제 일 수도 있지만 잘 모르겠습니다.

답변

0

내 질문에 제공된 spring.schemas의 구문은 3.rd party 소프트웨어의 적절한 정의입니다. 그들은 수동으로 "custDir:"에 반응하고 어떤 마법 알고리즘을 시작하는 EntityResolver을 구현했습니다. 그래서 다음 해결 방법을 찾았습니다.

my_spring.schemas은 (는) META-INF/에 있어야합니다. 스프링로드가 my_spring.schemas이고 spring.schemas이 아닌지 확인해야합니다.

ClassPathXmlApplicationContext의 하위 클래스 인 TestingContext을 구현하여이 작업을 수행했습니다. TestingContext에서 나는 protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException 메소드를 덮어 쓰고 구현으로 org.springframework.context.support.AbstractXmlApplicationContext에서 채 웠습니다. 내가 만든 유일한 변화는 beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this))beanDefinitionReader.setEntityResolver(new PluggableSchemaResolver(getClassLoader(), "META-INF/my_spring.schemas)으로 바꾸는 것이 었습니다. 그리고 만약 내가 TestingContextmy_spring.schemas을 사용한다면,

이 솔루션의 단점은 봄 견해를 정의하는 기본 이름이 변경 되었기 때문에 모든 xsd를 항아리에 제공해야한다는 것입니다.

0

동일한 항목이지만 사용자 정의 xsd 파일의 위치와 함께 사용자 정의 spring.schemas 파일을 제공하여이 항목을 "대체"할 수 있습니다. catch는 spring.schemas가로드되는 순서에 크게 의존하지만 시도해 볼만한 가치가있을 수 있습니다.

custDir은 place holder가 아니기 때문에 당신이하는 것처럼 그것을 대체 할 수 없습니다. 제 3의 스키마 위치가 classpath 외부에있는 것은 놀랍습니다.

+0

나는 내 자신의 spring.schemas로 "오버라이드"하려했지만 다른 병과 함께 작동하지 않았다. 다른 항아리를 제거하면 잘 작동합니다. 어쩌면 모든 spring.schemas에서 하나의 스키마 위치에 대해 여러 항목을 가질 수 없습니다 .--( – EhmKah