I explore the JAXB and the JAXB2 Maven plugin. I am confused of the bean instantiation.
I have two schemas in src/main/resources
with the same namespace www.mycompany.com
. schemaA.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 wsdl11Definition;
}
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 generatedwsdl11Definition.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
and a bit below:
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;
}
Does anyone know what happens? Why passing the XsdSchema
and XsdSchemaCollection
doesn't behave equally even they are supposed to do according to DefaultWsdl11Definition
?