Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JAXB doesnt create the XsdSchemaCollection bean using DefaultWsdl11Definition correctly [SWS-1041] #1108

Open
gregturn opened this issue Oct 6, 2018 · 0 comments

Comments

@gregturn
Copy link
Member

@gregturn gregturn commented Oct 6, 2018

Nikolas Charalambidis opened SWS-1041 and commented

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().


Affects: 2.0.5

Reference URL: https://stackoverflow.com/questions/52672270/jaxb-difference-between-xsdschema-and-xsdschemacollection-while-creating-the-def

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
1 participant
You can’t perform that action at this time.