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

如何在生成的XSD(CXF)中从父级提取空序列,cxf,Cxf,我有一个简单的测试 @WebService 公共接口测试{ @网络方法 字符串foo(Child); } 有一个非常基本的实现 @组件(“testWsEndpoint”) 公共类TestWsImpl实现TestWs{ @凌驾 公共字符串foo(最后一个子项){ 返回“Ok”; } } 在生成的WSDL中,我有 这是完全正确的,但客户要求删除该空的,可能是因为这会导致他们正在使用的某些工具出现问题。这在CXF中可能吗 另外一个问题是——是否可以强制CXF生成与WSDL分离的XSD?我知道,

我有一个简单的测试

@WebService
公共接口测试{
@网络方法
字符串foo(Child);
}
有一个非常基本的实现

@组件(“testWsEndpoint”)
公共类TestWsImpl实现TestWs{
@凌驾
公共字符串foo(最后一个子项){
返回“Ok”;
}
}
在生成的WSDL中,我有


这是完全正确的,但客户要求删除该空的
,可能是因为这会导致他们正在使用的某些工具出现问题。这在CXF中可能吗


另外一个问题是——是否可以强制CXF生成与WSDL分离的XSD?我知道,对于命令行JavaToWs,我可以简单地添加
-createxsdimports
参数,但是CXFServlet呢?

清除空的
目前是不可能的。这是因为JAXB目前是这样工作的。甚至还有一条评论:

我们既没有epsilon也没有emptySet,因此无法处理儿童。长度==0

如果您愿意,可以为JAXB团队提出一个bug。但是没有人回答

关于第二个问题——强制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优先的方法。我以这种方式开发了多种服务。当两个不同的系统进行通信时,具有严格的约束接口(模式、多样性)是非常有益的。在没有编写额外代码的情况下,为我完成了大量输入验证。诚然-编写WSDL不是一项令人愉快的任务,但一旦您有了服务定义,您就可以轻松地更改XSD文件中的输入和输出。

如果您想控制WSDL/XSD,为什么不开发它(即从WSDL/XSD开始,然后生成类)?这只是个人偏好。我正在创建新的WS,虽然有很多更改,但维护java类和生成WSDL比契约优先方法更容易。请求是在我发送第一个版本时发出的,该版本是由表示模型的Java类生成的。我个人的意见是,这个要求是毫无意义的,我只是想知道这是否可能。如果我想将现有的WS与固定的WSDL一起使用,那么我将使用契约优先的方法。但感谢您的提示,如果它生成不同的类,我可以尝试一下。也许最好是在某个阶段从java优先的方法切换到wsdl优先的方法,但我觉得这就像做两次相同的工作一样……我将尝试这个EndpointProperty。对于验证,我在cxf-serlet.xml中使用了
,因此我也没有对格式和必填字段进行输入验证;-)向属性添加另一个条目:
将具有与@EndpointProperty注释完全相同的效果。该键起到了魅力:-)我在考虑它,并使用WSDL优先的方法解决了另一个问题-不可能记录WSDL(不可能从Java类生成WSDL注释)。