在CXF上使用@XmlMimeType()在WSDL中生成的重复属性,为什么?

时间:2012-09-21 23:21:05

标签: wsdl cxf mtom

我开发了支持MTOM的CXF Web服务。我在我的DTO中添加了一个注释,告诉JAXB候选MTOM优化:

@XmlType
public class FileDTO {

    private String Name;
    private String FileType;

    @XmlMimeType("application/octet-stream")
    private DataHandler Dfile;
    ...

在部署Web服务时,WSDL中的DTO定义如下所示:

<xs:complexType name="fileDTO"> 
  <xs:sequence> 
    <xs:element name="Dfile" type="xs:base64Binary" minOccurs="0" xmime:expectedContentTypes="application/octet-stream"/> 
    <xs:element name="dfile" type="xs:base64Binary" minOccurs="0"/> 
    <xs:element name="fileType" type="xs:string" minOccurs="0"/> 
    <xs:element name="name" type="xs:string" minOccurs="0"/> 
  </xs:sequence> 
</xs:complexType>
不知怎的,私人成员DFile似乎是重复!!

为什么会这样?

当我尝试使用

生成Java客户端时
wsdl2java -client d:\service.wsdl

我收到以下错误:

WSDLToJava Error: d:\service.wsdl [26,1]: Two declarations cause a collision in the ObjectFactory class.

谢谢!

1 个答案:

答案 0 :(得分:1)

默认情况下,JAXB将所有公共属性视为已映射。由于您要对一个字段进行注释,并且其名称与该属性不匹配,因此您将获得第二个映射。

<强>解决方案

  1. 将注释从字段移动到属性(getter)。
  2. 在类上指定@XmlAceesorType(XmlAccessType.FIELD),以便JAXB将字段映射到字段上。