使用cxf验证wsdl / schema

时间:2010-04-05 18:01:10

标签: java validation wsdl cxf

我很难获得cxf来验证我的服务为第三方创建的xml请求。

我的项目使用maven。这是我的项目结构

主要模块:

+ Sub-Module1 =应用程序

+ sub-Module2 = Interfaces

在Interfaces中,在src / main / resources里面我有我的wsdl和xsd。 所以,src / main / resources         + mywsdl.wsdl。         + myschema.xsd

接口子模块在Application-sub-module中列为依赖项。 在Application子模块中,src / maim / resources中有一个cxsf文件。

<jaxws:client name="{myTargerNameSpaceName}port"
    createdFromAPI="true">
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="true" />
    </jaxws:properties>
</jaxws:client>

和:

    <jaxws:endpoint name="{myTargetNameSpaceName}port"
    wsdlLocation="/mywsdl.wsdl"
    createdFromAPI="true">
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="true" />
    </jaxws:properties>
</jaxws:endpoint>

我尝试将“name =”{myTargetNameSpaceName} port“更改为”name =“{myEndPointName} port”

但是没有铁砧。

我的申请有效。但它只是不验证我生产的xml必须由第三方应用程序使用。 我想让验证工作,以便我发送的任何请求都是有效的。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

只需在服务实现类上添加@org.apache.cxf.annotations.SchemaValidation注释,架构验证即可运行。

答案 1 :(得分:1)

首先确保name属性的值为{NAMESPACE} PORT_NAME,其中NAMESPACE是您的命名空间URI,PORT_NAME是您的WSDL端口的名称。在没有看到您的WSDL的情况下,我不知道您是否将WSDL端口命名为“端口”,或者您是否仅仅提供了一个清理过的示例。

例如,我的WSDL命名空间是“http://example.com/services”,我的WSDL端口元素的名称是“myPort”,Spring配置看起来像这样

<jaxws:endpoint name="{http://example.com/services}myPort" >
  ...

请参阅CXF docs

中的“CreatedFromAPI”属性说明

如果这不能解决您的问题,请尝试查看wsdl_first示例代码,升级您的CXF版本,和/或使用测试代码发布您的问题,向CXF user list展示您的问题。< / p>

答案 2 :(得分:0)

我们有类似的问题。 CXF 2.3.1修复了传入消息但不传出消息的问题。

https://issues.apache.org/jira/browse/CXF-3233

我们通过编组消息并在服务器中验证它们,然后通过CXF拦截器链发送它们来解决它。我们使用org.springframework.xml.validation.XmlValidator进行验证。

我希望未来的CXF版本能解决这个问题,但这就是我们现在所做的。