【问题标题】:Jaxb classes from schema generates getter setter method in uppercase来自模式的 Jaxb 类生成大写的 getter setter 方法
【发布时间】:2015-07-10 13:44:03
【问题描述】:

我正在使用 JAX-WS 生成自上而下的 Web 服务。在 wsdl 中,我正在导入一个包含所有必要元素的 xsd。我需要在soap请求中以大写显示所有xml节点,因此我将xsd中的元素名称保留为大写。但是在从 wsdl 生成类时,我可以看到 getter 和 setter 方法也以大写命名,但不是变量。例如,如果我在 xsd 中使用“SOURCE”作为元素,我将获得相应的 getter 方法作为“getSOURCE”而不是常规约定“getSource”。我尝试通过从模式生成 jaxb 类来玩游戏,同时保持 xsd 单独存在,但我无法获得预期的命名约定。

以下是使用的架构的一部分

<xs:complexType name="Data">
<xs:sequence>
  <xs:element name="SEQ" type="xs:int"/>
  <xs:element name="INDEX" type="xs:string"/>
  <xs:element name="VALUE" type="xs:string"/>
</xs:sequence>

这会在 jaxb 绑定后生成以下代码 -

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Data", propOrder = {
    "seq",
    "index",
    "value"
})
public class Data {

@XmlElement(name = "SEQ")
protected int seq;
@XmlElement(name = "INDEX", required = true)
protected String index;
@XmlElement(name = "VALUE", required = true)
protected String value;

public int getSEQ() {
    return seq;
}

public void setSEQ(int value) {
    this.seq = value;
}

public String getINDEX() {
    return index;
}

public void setINDEX(String value) {
    this.index = value;
}

public String getVALUE() {
    return value;
}

public void setVALUE(String value) {
    this.value = value;
}

}

这里的 setter 方法被生成为 setSEQ,我需要它像 'setSeq' 这样的骆驼案例。

【问题讨论】:

    标签: java xml web-services xsd jaxb


    【解决方案1】:

    这是预期的行为。底层的 xjc 调用遵循 Java Bean 约定:如果属性名称的前两个字母是大写的,则不会对 get 和 set 方法应用大写或取消大写。

    您可以在 JAXB 外部绑定文件中指定自己的覆盖方法绑定,该文件是一个 XML 文件,按照约定具有 .xjb 扩展名。它的格式在JAXB specification的第7章中有描述:

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings version="2.0"
                   xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                   xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
        <jaxb:bindings schemaLocation="data.xsd">
    
            <jaxb:bindings node="//xs:complexType[@name='Data']">
                <jaxb:bindings node=".//xs:element[@name='SEQ']">
                    <jaxb:property name="seq"/>
                </jaxb:bindings>
                <jaxb:bindings node=".//xs:element[@name='INDEX']">
                    <jaxb:property name="index"/>
                </jaxb:bindings>
                <jaxb:bindings node=".//xs:element[@name='VALUE']">
                    <jaxb:property name="value"/>
                </jaxb:bindings>
            </jaxb:bindings>
    
        </jaxb:bindings>
    
    </jaxb:bindings>
    

    请注意,"data.xsd" 应替换为架构文件的相对 URI。

    您可以将上述内容放在一个名为 custom.xjb 的文件中,然后将其传递给您的 wsimport 调用:

    wsimport -d build/generated-classes -p com.example.myapp.data -b custom.xjb http://www.example.com/data-service.wsdl
    

    【讨论】:

    • 有没有办法使用通用绑定而不是每个已知属性的绑定来处理这个问题?
    • @trebor 如果您能够将类添加到包含 bean 类的包中,您可以编写自定义 BeanInfo 来定义您希望的属性名称。参见the documentation of Introspector 了解如何添加自定义 BeanInfo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多