0

我有简单的测试 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 分离的 XSD?我知道对于命令行 JavaToWs,我可以简单地添加-createxsdimports参数,但是 CXFServlet 呢?

4

1 回答 1

1

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

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

如果您愿意,可以为 JAXB 团队提出一个错误。甚至有人提出了这个问题,但没有答案。

关于第二个问题 - 强制 CXF 生成与 WSDL 分离的 XSD。可以使用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-first 方法。我以这种方式开发了多种服务。当两个不同的系统进行通信时,与约束(模式、多重性)有严格的接口是非常有益的。为我完成了很多输入验证,而无需编写额外的代码。没错——编写 WSDL 并不是一件令人愉快的任务,但是一旦有了服务定义,您就可以轻松地更改 XSD 文件中的输入和输出。

于 2013-10-09T16:04:15.680 回答