将生成的JAXB类与web服务wsdl.xsd中的列表一起使用



xsd文件中有类定义。我使用JAXB绑定生成了类。对于列表,我没有设置器。

之后,我在web服务中使用了这些类。我为服务创建了wsdl+xsd。但是在xsd中,我没有一些字段定义(对于列表,因为我没有这些字段的setter)。

如何为我的类正确生成wsdl+xsd?

Netbeans 7.3.1+Glassfish

示例代码:基本XSD:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:element name="A">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="B">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="FIELD1" type="xs:dateTime">
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

我做JAX绑定,所以它生成了类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "b"
})
@XmlRootElement(name = "A")
public class A {
@XmlElement(name = "B", required = true)
protected List<A.B> b;
public List<A.B> getB() {
    if (b == null) {
        b = new ArrayList<A.B>();
    }
    return this.b;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "field1"
})
public static class B {
    @XmlElement(name = "FIELD1", required = true)
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar field1;
    public XMLGregorianCalendar getFIELD1() {
        return field1;
    }
    public void setFIELD1(XMLGregorianCalendar value) {
        this.field1 = value;
    }
}

}

如您所见,b字段没有setter。。。

我在网络服务中使用它:

@WebMethod(operationName = "hello")
public String hello(@WebParam(name = "name") A txt) {
    return "Hello " + txt + " !";
}

最后,我有wsdl+xsd,有一个类,但没有字段:

  <xs:complexType name="a"><xs:sequence/>
  </xs:complexType>
JAXB不为Collections生成setter。您可以使用getter访问您的列表,然后使用列表方法对其进行修改

示例:

txt.getB().add(new B());

来源:请参阅此处了解详细信息。

因评论而编辑:

在对这个问题进行进一步分析后,我认为您想要的是JiBX的BindGen工具。它是一个";用于从现有Java代码生成绑定定义和匹配模式定义的工具";。

希望这能帮助你进一步解决问题。

最新更新