如何从生成的XSD(CXF)中的父级提取空序列

时间:2013-10-09 09:15:29

标签: cxf

我有简单的测试WS

@WebService
public interface TestWs {

    @WebMethod
    String foo(Child child);

}

有一个非常基本的实现

@Component("testWsEndpoint")
public class TestWsImpl implements TestWs {

    @Override
    public String foo(final Child child) {
        return "Ok";
    }

}

在生成的WSDL中我有

<xs:complexType name="child">
    <xs:complexContent>
        <xs:extension base="tns:parent">
            <xs:sequence/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

这是完全正确的,但客户要求删除该空<xs:sequence/>,可能是因为它导致他们使用的某些工具出现问题。这在CXF中是否可行?

附加排队是 - 是否可以强制CXF生成与WSDL分离的X​​SD?我知道对于命令行JavaToWs我只需添加-createxsdimports参数,但是CXFServlet呢?

1 个答案:

答案 0 :(得分:1)

摆脱空<xsd:sequence/>目前是不可能的恕我直言。这是因为JAXB目前以这种方式工作。 JAXB implementation中甚至还有一条评论:

  

我们既没有epsilon也没有emptySet,所以无法处理children.length == 0很好

如果您愿意,可以为JAXB团队提出错误。 Someone even raised this issue但没有答案。

关于第二个问题 - 强制CXF生成与WSDL分离的X​​SD。可以使用org.apache.cxf.wsdl.create.imports属性。您可以使用注释设置它:

@EndpointProperty(key="org.apache.cxf.wsdl.create.imports", value="true")

在您的界面或实现类上。

之后你会得到类似的东西:

<wsdl:definitions name="TestWsImplService" targetNamespace="http://server.hw.demo/">
    <wsdl:types>
        <schema>
            <import namespace="http://server.hw.demo/" schemaLocation="http://localhost:9000/test?xsd=TestWsImplService_schema1.xsd"/>
        </schema>
    </wsdl:types>
    ...

回到我原来的评论我会推荐WSDL第一种方法。我开发了这种方式的多种服务。当两个不同的系统进行通信时,与约束(模式,多重性)的严格接口是非常有益的。我没有编写额外的代码就完成了大量的输入验证。真的 - 编写WSDL并不是一件令人愉快的事情,但是一旦你有了服务定义,就可以轻松地改变XSD文件中的输入和输出。