【问题标题】:CXF/JAXB Code-first service: modify XMLSchemaType of inputsCXF/JAXB 代码优先服务:修改输入的 XMLSchemaType
【发布时间】:2025-12-28 12:45:11
【问题描述】:

我正在开发 CXF/JAXB 代码优先 Web 服务。我希望能够修改某些输入的 WSDL 定义。

例如,给定如下接口sn-p:

@WebMethod
public void Something(@WebParam(name="date") Date date);

WSDL 将为输入“date”生成 XMLSchema,使其成为“datetime”xml 元素。我希望它只是一个“日期”元素。

如果能够指定其他一些输入属性,例如 minOccurs 等,那也很好。

对于自定义对象,子元素可以通过 XmlElement 和 XmlSchemaType 等注解来定义所有这些东西。但是,这些注解在输入参数上是不合法的。

我知道早期版本的 CXF 没有处理这个问题,但我不确定后面的版本。我目前正在运行 CXF 2.3.5。

【问题讨论】:

    标签: java wsdl jaxb cxf


    【解决方案1】:

    这是我从 cxf-users 列表中得到的答案:

    1) 通过 JDK 认可机制之一认可 JAXB 2.2 API jar。 然后可以在参数上使用 XmlElement 和 XmlSchemaType 注解。

    (这不太正确——我认可的 2.2 jaxb 确实允许在参数上使用 @XmlElement 注释,但不允许使用 @XmlSchemaType 注释)

    2) 创建 wrapper 类型的 bean(可以使用 java2ws -warpperBeans 作为起点)并将@RequestWrapper/@ResponseWrapper 注解添加到 指向它们的方法。您可以精细控制外观 通过 bean 中的注释包装模式。

    3) 您可以将 AbstractServiceConfiguration 的额外子类配置到工厂中,您可以在其中覆盖一些方法来设置各种 minOccurs/maxOccurs/etc.. 键入内容。非常精细的控制水平,但非常 做起来很复杂。

    【讨论】:

    • 我最终使用了选项 2,它为我提供了足够的控制权来满足我的需求,尽管它确实添加了相当多的代码来调整 WSDL。