복붙노트

[SPRING] 자바 - 봄 WS -로드 상대는 XSD 파일에 포함 (톰캣 8)

SPRING

자바 - 봄 WS -로드 상대는 XSD 파일에 포함 (톰캣 8)

나는 다음과 같은 코드를 사용하여 XSD 파일의 컬렉션에서 동적 WSDL을 생성하는 봄 웹 서비스를 만든 :

Resource[] schema = {
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/HL7V3/NE2008/coreschemas/NarrativeBlock.xsd"),
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/HL7V3/NE2008/coreschemas/datatypes-base.xsd"),
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/HL7V3/NE2008/coreschemas/infrastructureRoot.xsd"),
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/HL7V3/NE2008/multicacheschemas/PRPA_IN201305UV02.xsd"),
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/HL7V3/NE2008/multicacheschemas/PRPA_IN201306UV02.xsd"),
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/IHE/XCPD_PLQ.xsd"),
            new ClassPathResource(
                    "schema/service/XCPD.SupportMaterials.v9/schema/HL7V3/XCPD_PRPA.xsd") };
    CommonsXsdSchemaCollection collection = new CommonsXsdSchemaCollection(
            schema);
    collection.setInline(true);
    return collection;

동적 WSDL을 만드는 데 사용되는 XSD 파일은 다음과 같은 문장을 포함하여 다른 여러 스키마 파일을 포함한다 :

<xs:include schemaLocation="../coreschemas/voc.xsd"/>
<xs:include schemaLocation="../coreschemas/datatypes.xsd"/>

나는 톰캣 (8) 컨테이너의 코드를 실행하면, 다음과 같은 예외가 나타납니다

Caused by: java.lang.IllegalArgumentException: The resource path [/../coreschemas/infrastructureRoot.xsd] has been normalized to [null] which is not valid

봄의 URI의 해결이 (가) "/"경로의 앞에,이 파일이 참조되는 경우에도 상대 경로 (안 절대 경로)과 스키마를 가져올 때 실패 앞에 추가합니다.

톰캣 8로 마이그레이션하려고 할 때이 응용 프로그램은 문제가 발생되어, 톰캣 7에서 잘 실행 주목해야한다.

톰캣 8은 웹 자원이 현재로드되는 방법을 방법을 변경했다. 자바 CodeRanch에서 더 많은 정보 ...

어떤 방법으로 길고도 짧은 이야기, URI를 해결 프로그램이 제대로 상대 파일을 치료해야한다고 봄을 강제하는 방법은 무엇입니까? 내가 해결 스프링 사용 (ClasspathUriResolver)의 "collectionBaseURI"속성을 보면,이 값은 null입니다. 뿐만 아니라이 기본 URI를 설정하는 방법이 있나요?

편집 나는 그러나 내가 파일의 수백에 걸쳐이 수정 프로그램을 적용하지 않으 ... 스키마에 절대 경로에 대한 모든 상대 경로를 변환하여이 문제를 해결할 수 있습니다.

해결법

  1. ==============================

    1.경우 사람이 성가신 문제로 실행에서 ClasspathUriResolver는 "/"에 상대 경로가 포함 붙이는, 범인이었다. 나는 기본 (org.apache.ws.commons.schema.resolver.DefaultURIResolver에서) URI 해결 프로그램을 사용하도록 전환과 톰캣 8 문제없이 잘 실행됩니다.

    경우 사람이 성가신 문제로 실행에서 ClasspathUriResolver는 "/"에 상대 경로가 포함 붙이는, 범인이었다. 나는 기본 (org.apache.ws.commons.schema.resolver.DefaultURIResolver에서) URI 해결 프로그램을 사용하도록 전환과 톰캣 8 문제없이 잘 실행됩니다.

    CommonsXsdSchemaCollection collection = new CommonsXsdSchemaCollection(schema);
    collection.setUriResolver(new DefaultURIResolver());
    collection.setInline(true);
    return collection;
    
  2. from https://stackoverflow.com/questions/30769707/java-spring-ws-loading-relative-includes-in-xsd-files-tomcat-8 by cc-by-sa and MIT license