我有简单的测试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呢?
答案 0 :(得分:1)
摆脱空<xsd:sequence/>
目前是不可能的恕我直言。这是因为JAXB目前以这种方式工作。 JAXB implementation中甚至还有一条评论:
我们既没有epsilon也没有emptySet,所以无法处理children.length == 0很好
如果您愿意,可以为JAXB团队提出错误。 Someone even raised this issue但没有答案。
关于第二个问题 - 强制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文件中的输入和输出。