2015-06-11 9 views
6

ho creato un servizio web Primavera che crea un WSDL dinamica da una raccolta di file XSD utilizzando il seguente codice:Java - Ws Primavera - Caricamento relativa Include nei file XSD (Tomcat 8)

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; 

I file XSD utilizzato per creare il WSDL dinamica includono altri vari file di schema utilizzando includere affermazioni come la seguente:

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

Quando eseguo il codice in un contenitore Tomcat 8, ricevo la seguente eccezione:

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

Il resolver URI di Spring antepone "/" davanti al percorso, anche se questo file a cui si fa riferimento è un percorso relativo (non un percorso assoluto) e non riesce quando si importa lo schema.

Va notato che questa applicazione funzionava bene su Tomcat 7. Quando si tenta di migrare a Tomcat 8, i problemi si presentano.

Tomcat 8 ha cambiato il modo in cui vengono ora caricate le risorse web. More Information from Java CodeRanch ...

In ogni caso, per farla breve, c'è un modo per forzare Spring che il risolutore URI debba trattare correttamente i file relativi? Se guardo la proprietà "collectionBaseURI" sul resolver Spring usa (ClasspathUriResolver), questo valore è nullo. C'è un modo per impostare anche questo URI di base?

EDIT Posso risolvere questo problema convertendo tutti i percorsi relativi in ​​percorsi assoluti in schemi ... tuttavia non voglio applicare questa correzione su centinaia di file.

risposta

5

Nel caso in cui qualcuno si imbattesse in questo fastidioso problema, il ClasspathUriResolver era il colpevole, anteponendo un "/" al percorso relativo. L'ho passato per utilizzare un URI Resolver predefinito (in org.apache.ws.commons.schema.resolver.DefaultURIResolver) e funziona senza problemi su Tomcat 8.

CommonsXsdSchemaCollection collection = new CommonsXsdSchemaCollection(schema); 
collection.setUriResolver(new DefaultURIResolver()); 
collection.setInline(true); 
return collection; 
Problemi correlati