Я изучаю плагин JAXB и JAXB2 Maven.Я запутался в реализации объекта.
У меня есть две схемы в src/main/resources
с тем же пространством имен www.mycompany.com
. schemaA.xsd и schemaB.xsd имеют одинаковый заголовок:
<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
, расширяющий WsConfigurerAdapter
, определяет ServletRegistrationBean
также следующиеXsdSchema(Collection)
bean:
// 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();
}
};
}
И bean-компонент WSDL:
@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;
}
Использование одного из них в приведенном выше bean-компоненте:
wsdl11Definition.setSchema(schema);
Если я использую только XsdSchema
, определяя одну схему (независимо от схемы или схемы B), все работает, веб-служба SOAP работает и WSDL генерируется
wsdl11Definition.setSchemaCollection(schemaCollection);
Теперь NPE выбрасывается, хотя InliningXsdSchemaTypesProvider
устанавливает одну схему как коллекцию с одной схемой.Возникла ошибка:
2018-10-05 21: 29: 28.636 WARN 164968 --- [main] ConfigServletWebServerApplicationContext: во время инициализации контекста возникла исключительная ситуация - отмена попытки обновления: org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем soapWsdl, определенным в ресурсе пути к классу [cz / vse / soap / WebServiceConfig.class]: создание экземпляра компонента с помощью метода фабрики не выполнено;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition]: метод фабрики 'defaultWsdl11Definition' вызвал исключение;вложенное исключение - java.lang.NullPointerException
и чуть ниже:
Причина: java.lang.NullPointerException: null at org.springframework.xml.xsd.SimpleXsdSchema.getTargetNamespace (SimpleXsdSchema.java:94) ~ [spring-xml-3.0.3.RELEASE.jar! /: na] в com.mycompany.WebServiceConfig.defaultWsdl11 ~jervigf ()[классы! /: 0.0.1]
Я заставляю вещи работать с вызовом SimpleXsdSchema::afterPropertiesSet
, который каким-то образом не вызывается при создании экземпляра компонента.Трудно сказать, что происходит.Однако редактирование метода, как этот, заставляет схемы работать вместе:
@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;
}
Кто-нибудь знает, что происходит?Почему прохождение XsdSchema
и XsdSchemaCollection
не ведет себя одинаково, даже если они должны делать в соответствии с DefaultWsdl11Definition
?