2016-06-16 3 views
2

zweiten Mal Ich versuche, dies ohne Antwort zu fragen, obwohl ich denke, das sollte nicht eine schwierige Frage für einen guten Frühling Entwickler sein ..Frühling 4, SOAP WS, XSD ... zwei verschiedene WSDL

ich möchte eine einfache Feder 4 (Annotation angetrieben) Anwendung erstellen, wird dies die maven-jaxb-Plugin verwenden alle Request-Response-Objekt Fabrik und Objekt-Mapping-Klassen zu erzeugen ...

ich diese Anwendung wollen Um 2 WSDL zu erzeugen, habe ich, wie ich angenommen habe, mit zwei verschiedenen XSD und zwei verschiedenen SPRING WsConfigurerAdapter-Klassen begonnen, die sowohl WSDL als auch offensichtlich zwei verschiedene Klassen für End verwalten Punkte ..

Aller Arbeit ... Aber meine Frage ist:

Ich habe eine Bohne zwischen den beiden WSDL geteilt und damit zwischen den beiden XSD, wie dies zu erreichen? XSD und Maven Plugin Seite, alles funktioniert auch, wenn ich einen komplexen Typ innerhalb einer XSD deklariere und dann importiere oder in die zweite einbeziehe, aber SPRING 4 Seite, wenn ich nur den Import und die Bean, die WSDL mit der hinzufügen Import wurde nicht gelöst, etwas wie unerwartetes Ende der Datei, es ist offensichtlich, dass ich vermisse oder etwas falsch mache ... aber was?

Die erste XSD, wo das gemeinsame Unternehmen erklärt ..

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:usr="http://concretepage.com/soap/userManagement" targetNamespace="http://concretepage.com/soap/userManagement"> 

    <xs:element name="getUserRequest"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="userId" type="xs:int" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="getUserResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="user" type="usr:user" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <!-- share bean --> 
    <xs:complexType name="user"> 
     <xs:sequence> 
      <xs:element name="userId" type="xs:int" /> 
      <xs:element name="userName" type="xs:string" /> 
      <xs:element name="age" type="xs:int" /> 
      <xs:element name="password" type="xs:string" /> 
      <xs:element name="passwordffd" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

Die zweite XSD, jetzt wird der Import kommentiert und alles wie dies funktioniert, aber ohne das Element Benutzer in den Job eingespritzt wird, wenn i ermöglichen es mit dem Import, der Jobmanagement WSDL SOAP-UI Last versagt:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://concretepage.com/soap/jobManagement" targetNamespace="http://concretepage.com/soap/jobManagement" 
    xmlns:usr="http://concretepage.com/soap/userManagement"> 
    <!-- import --> 
    <!-- xs:import schemaLocation="userManagement.xsd" 
     namespace="http://concretepage.com/soap/userManagement"/--> 

    <xs:element name="getJobRequest"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="jobId" type="xs:int" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="getJobResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="job" type="tns:job" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="job"> 
     <xs:sequence> 
      <xs:element name="jobId" type="xs:int" /> 
      <xs:element name="jobName" type="xs:string" /> 
      <xs:element name="jobRole" type="xs:string" /> 
      <xs:element name="salary" type="xs:int" /> 
      **<!-- xs:element name="user" type="usr:user" /-->** 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Dies ist die Frühlings-Klasse ist die WSDL zu erzeugen, die die gemeinsame Bohne hat:

@Configuration 
@EnableWs 
@ComponentScan("com.concretepage") 
public class JobConfig extends WsConfigurerAdapter { 

    @Bean(name = "jobManagement") 
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema jobSchema) { 
     DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
     wsdl11Definition.setPortTypeName("jobManagementPort"); 
     wsdl11Definition.setLocationUri("/soapws/jobManagement/"); 
     wsdl11Definition.setTargetNamespace("http://localhost:8080/spring4soap/"); 
     wsdl11Definition.setSchema(jobSchema); 

     return wsdl11Definition; 
    } 

    @Bean 
    public XsdSchema jobSchema() { 
     return new SimpleXsdSchema(new ClassPathResource("jobManagement.xsd")); 
    } 
} 

Antwort

1

Okay, ersetzen

wsdl11Definition.setSchema(jobSchema); 

von

wsdl11Definition.setSchemaCollection(mySchemaCollection()); 

Ihre Sammlung Körperbau:

@Bean 
public XsdSchemaCollection quotesSchemaCollection() { 
    return new XsdSchemaCollection() { 

     public XsdSchema[] getXsdSchemas() { 
      return new XsdSchema[]{new SimpleXsdSchema(new ClassPathResource("a.xsd")), new SimpleXsdSchema(new ClassPathResource("b.xsd"))}; 
     } 

     public XmlValidator createValidator() { 
      throw new UnsupportedOperationException(); 
     } 
    }; 
} 

Quelle: Frühlings-Doc -> spring.io

+0

Rückkehr neue CommonsXsdSchemaCollect ion (neue ClassPathResource ("a.xsd"), neue ClassPathResource ("b.xsd")); – Kai