首页 > 解决方案 > 创建 DefaultWsdl11Definition bean 时 XsdSchema 和 XsdSchemaCollection 之间的 JAXB 区别

问题描述

我探索了 JAXB 和 JAXB2 Maven 插件。我对bean实例化感到困惑。

我有两个src/main/resources具有相同命名空间的模式www.mycompany.comschemaA.xsdschemaB.xsd具有相同的标头:

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

我的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();
        }
    };
}

和 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;
}

在上面的 bean 中使用其中之一:


SimpleXsdSchema::afterPropertiesSet我通过调用bean 实例化没有以某种方式调用的方法使事情正常工作。很难说会发生什么。但是,像这样编辑方法会使模式一起工作:

@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;
}

有谁知道会发生什么?为什么通过XsdSchemaand的XsdSchemaCollection行为即使他们应该按照 也不会表现得一样DefaultWsdl11Definition

标签: javaspringspring-bootjaxbmaven-jaxb2-plugin

解决方案


推荐阅读