java - 创建 DefaultWsdl11Definition bean 时 XsdSchema 和 XsdSchemaCollection 之间的 JAXB 区别
问题描述
我探索了 JAXB 和 JAXB2 Maven 插件。我对bean实例化感到困惑。
我有两个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">
我的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 中使用其中之一:
wsdl11Definition.setSchema(schema);
如果我只使用
XsdSchema
定义一个模式(无论是 schemaA 还是 schemaB),一切正常,SOAP Web 服务正在运行并生成 WSDLwsdl11Definition.setSchemaCollection(schemaCollection);
现在 NPE 被抛出,尽管
InliningXsdSchemaTypesProvider
将一个模式设置为具有一个模式的集合。抛出的错误是:2018-10-05 21:29:28.636 WARN 164968 --- [main] ConfigServletWebServerApplicationContext:在上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名称为“soapWsdl”的bean时定义在类路径资源 [cz/vse/soap/WebServiceConfig.class]:通过工厂方法进行 Bean 实例化失败;嵌套异常是 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] at com。 mycompany.WebServiceConfig.defaultWsdl11Definition(WebServiceConfig.java:66) ~[classes!/:0.0.1]
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;
}
有谁知道会发生什么?为什么通过XsdSchema
and的XsdSchemaCollection
行为即使他们应该按照 也不会表现得一样DefaultWsdl11Definition
?
解决方案
推荐阅读
- r - 将索引数据框应用于动物园对象
- css - 如何使用反应引导程序连续设置卡片
- javascript - 使用 CSS 引用 Web 组件根属性
- c++ - 单击系统托盘通知时启动 UI 或应用程序
- javascript - 如何将翻译后的属性文件保存为从右到左?
- java - Quarkus 使用 OffsetDateTime 保存实体,没有偏移量/时区
- symfony - 在 Symfony 5.1 中使用默认参数在路由中保留斜杠
- python - 如何用正则表达式替换找到的数据?
- typescript - 是否可以强制类型转换?
- javascript - 显示一个 i 框架,使用 vanilla JavaScript 隐藏另一个