Разница JAXB между XsdSchema и XsdSchemaCollection при создании bean-компонента DefaultWsdl11Definition - PullRequest
0 голосов
/ 05 октября 2018

Я изучаю плагин 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?

...