Uploaded image for project: 'Spring Web Services'
  1. Spring Web Services
  2. SWS-1041

JAXB doesnt create the XsdSchemaCollection bean using DefaultWsdl11Definition correctly

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 2.0.5
    • Fix Version/s: None
    • Component/s: OXM, XML
    • Environment:
      Windows 10, Java 1.8.0_172

      Description

      Hi,

      I have two schemas in src/main/resources with the same namespace www.mycompany.comschemaA.xsd and schemaB.xsd have the same header:

      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:tns="http://www.mycompany.com" 
         targetNamespace="http://www.mycompany.com" 
         elementFormDefault="qualified">

      My WebServiceConfiguration extending WsConfigurerAdapter defines aside the ServletRegistrationBean also the following XsdSchema(Collection) beans:

      // Just a bean with one schema
      @Bean
      public XsdSchema schema() {
          return new SimpleXsdSchema(new ClassPathResource("xsd/schemaA.xsd"));
      }
      
      // A bean with both schemas
      @Bean
      public XsdSchemaCollection schemaCollection() {
          return new XsdSchemaCollection() {
      
              @Override
              public XsdSchema[] getXsdSchemas() {
                  return new XsdSchema[] {
                      new SimpleXsdSchema(new ClassPathResource("xsd/schemaA.xsd")),
                      new SimpleXsdSchema(new ClassPathResource("xsd/schemaB.xsd"))
                  };
              }
      
              @Override
              public XmlValidator createValidator() {
                  throw new UnsupportedOperationException();
              }
          };
      }
      

      And the WSDL bean:

      @Bean(name = "soapWsdl")
      public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema schema, XsdSchemaCollection schemaCollection) {
          DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
          wsdl11Definition.setPortTypeName("SoapPort"); 
          wsdl11Definition.setLocationUri("/service/soap"); 
          wsdl11Definition.setTargetNamespace("https://www.mycompany.com");
          // At this point I use just one of the folliwing:
          wsdl11Definition.setSchema(schema);
          wsdl11Definition.setSchemaCollection(schemaCollection);
          return wsdl11Definitionl;
      }
      

      Using one of these in the bean above:

      • wsdl11Definition.setSchema(schema);

      If I use only XsdSchema defining one schema (regardless whether schemaA or schemaB), everything works, the SOAP Web service is running and WSDL is generated

      • wsdl11Definition.setSchemaCollection(schemaCollection);

      Now the NPE is thrown although the InliningXsdSchemaTypesProvider sets the one schema as the collection with one schema. The error thrown is:

      2018-10-05 21:29:28.636 WARN 164968 — [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'soapWsdl' defined in class path resource [cz/vse/soap/WebServiceConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition]: Factory method 'defaultWsdl11Definition' threw exception; nested exception is java.lang.NullPointerException

      ...

      Caused by: java.lang.NullPointerException: null at org.springframework.xml.xsd.SimpleXsdSchema.getTargetNamespace(SimpleXsdSchema.java:94) ~[spring-xml-3.0.3.RELEASE.jar!/:na] at com.mycompany.WebServiceConfig.defaultWsdl11Definition(WebServiceConfig.java:66) ~[classes!/:0.0.1]

      I make the things work with calling the SimpleXsdSchema::afterPropertiesSet which is not somehow called upon the bean instantiation. Hard to say what happens. However, editing the method like this makes the schemas work together:

      @Override
      public XsdSchema[] getXsdSchemas() {
          SimpleXsdSchema[] schemaArray = new SimpleXsdSchema[] {
              new SimpleXsdSchema(new ClassPathResource("xsd/schemaA.xsd")),
              new SimpleXsdSchema(new ClassPathResource("xsd/schemaB.xsd"))
          };
          for (SimpleXsdSchema schema : schemaArray) {
              try { 
                  schema.afterPropertiesSet();
              } catch (ParserConfigurationException | IOException | SAXException e) { 
                  /* ...*/
              }
          }
      
          return schemaArray;
      }
      

      Why passing the XsdSchema and XsdSchemaCollection doesn't behave equally even they are supposed to do according to DefaultWsdl11Definition? I expect it should work even without calling the schema.afterPropertiesSet().

        Attachments

          Activity

            People

            Assignee:
            Unassigned
            Reporter:
            Nichar Nikolas Charalambidis
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Dates

              Created:
              Updated: