我使用 maven cxf-codegen-plugin
从 wsdl 生成了一个 Web 服务。这很好,我没有异常(exception)。
然后我尝试使用此代码实例化 Web 服务(生成服务类):
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setEndpointName(SERVICE_NAME);
factory.setAddress("https://someadress:port/spec");
factory.setServiceClass(Service.class);
this.port = (Service) factory.create();
在调用 create 方法时,在 weblogic 上运行时收到以下异常:
weblogic.application.ModuleException: org.apache.ws.commons.schema.XmlSchemaException: Top-level attributes may not have a 'use'
...
Caused By: org.apache.ws.commons.schema.XmlSchemaException: Top-level attributes may not have a 'use'
at org.apache.ws.commons.schema.XmlSchemaAttribute.setUse(XmlSchemaAttribute.java:109)
at org.apache.ws.commons.schema.SchemaBuilder.handleAttribute(SchemaBuilder.java:966)
at org.apache.ws.commons.schema.SchemaBuilder.handleSchemaElementChild(SchemaBuilder.java:1519)
at org.apache.ws.commons.schema.SchemaBuilder.handleXmlSchemaElement(SchemaBuilder.java:659)
at org.apache.ws.commons.schema.SchemaBuilder.build(SchemaBuilder.java:157)
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:497)
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:483)
at org.apache.cxf.common.xmlschema.SchemaCollection.read(SchemaCollection.java:133)
at org.apache.cxf.databinding.AbstractDataBinding.addSchemaDocument(AbstractDataBinding.java:192)
at org.apache.cxf.databinding.AbstractDataBinding.addSchemaDocument(AbstractDataBinding.java:95)
at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:393)
at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:490)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:697)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:550)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:214)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:155)
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:156)
AFIAK,在 Web 服务初始化中的任何地方都没有引用 wsdl,我假设当成功生成类时,Web 服务是从有效源生成的。
无论如何,我不知道该消息的含义。是的,我在互联网上找到了有关此问题的单个链接:http://cxf.547215.n5.nabble.com/Schema-validation-errors-on-publish-quot-top-level-elements-may-not-have-a-use-quot-td5724860.html 但我还是不知道出了什么问题。
另一件事是,我不太确定顶级属性的定义是什么。我用谷歌搜索“xml顶级属性”,但在结果的前两页上,没有定义。
因此,我搜索了从 wsdl 引用的 XSD,并发现了 opengis gml 中包含“use=”的一些内容以及其他 XSD:
<complexType name="UnitOfMeasureType">
<sequence/>
<attribute name="uom" type="gml:UomIdentifier" use="required"/>
</complexType>
还有这个:
<attributeGroup name="extendedLink">
<attribute name="type" type="string" fixed="extended" form="qualified"/>
<attribute ref="xlink:role" use="optional"/>
<attribute ref="xlink:title" use="optional"/>
</attributeGroup>
其中一些事情有问题吗?
当我从单元测试中运行 Web 服务时,它可以工作,但在部署到 Weblogic 上时却不能。
我使用:
- Apache CXF 2.6.11
- Weblogic 12.1.2.0.0
- Oracle Java 1.7.0_25
最佳答案
Weblogic 的最新版本使用 MOXy 作为其 JAXB 实现,而不是 JAXB 引用实现或内置于 JDK 中的实现。如果这在 Weblogic 之外工作,则可能是 MOXy 中的问题。 CXF 团队在 MOXy 的模式生成(以及其他领域)中发现了多个错误。好消息是 MOXy 团队通常会相当迅速地修复发现的任何问题。如果您可以将其提炼为一个小测试用例,那可能会有很大帮助。
关于java - XmlSchemaException : Top-level attributes may not have a 'use' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117215/