xjc java classes generation,其中字段与@XmlElement同名

时间:2017-04-05 14:08:25

标签: java xjc

我使用这个xjc脚本

从.xsd文件创建java类
for %%f in (*.xsd) do (
    xjc -no-header %%f
)
pause

它会生成看起来像这样的类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AppData1", propOrder = {
    "appInstllCd",
    "appVrsn",
    "os",
    "osVrsn",
    "device"
})
public class AppData1 {

    @XmlElement(name = "AppInstllCd")
    protected String appInstllCd;
    @XmlElement(name = "AppVrsn")
    protected String appVrsn;
    @XmlElement(name = "OS")
    protected String os;
    @XmlElement(name = "OSVrsn")
    protected String osVrsn;
    @XmlElement(name = "Device")
    protected String device;

    /**
     * Gets the value of the appInstllCd property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAppInstllCd() {
        return appInstllCd;
    }

    /**
     * Sets the value of the appInstllCd property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAppInstllCd(String value) {
        this.appInstllCd = value;
    }

    /**
     * Gets the value of the appVrsn property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAppVrsn() {
        return appVrsn;
    }

    /**
     * Sets the value of the appVrsn property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAppVrsn(String value) {
        this.appVrsn = value;
    }

    /**
     * Gets the value of the os property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getOS() {
        return os;
    }

    /**
     * Sets the value of the os property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setOS(String value) {
        this.os = value;
    }

    /**
     * Gets the value of the osVrsn property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getOSVrsn() {
        return osVrsn;
    }

    /**
     * Sets the value of the osVrsn property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setOSVrsn(String value) {
        this.osVrsn = value;
    }

    /**
     * Gets the value of the device property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getDevice() {
        return device;
    }

    /**
     * Sets the value of the device property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setDevice(String value) {
        this.device = value;
    }
}

我想知道我是否可以某种方式更改我的脚本,这使得我的类字段与@XmlElement具有相同的名称,例如结果将是:

    @XmlElement(name = "AppInstllCd")
    protected String AppInstllCd;
    @XmlElement(name = "AppVrsn")
    protected String AppVrsn;
    @XmlElement(name = "OS")
    protected String OS;
    @XmlElement(name = "OSVrsn")
    protected String OSVrsn;
    @XmlElement(name = "Device")
    protected String Device;

1 个答案:

答案 0 :(得分:1)

您需要绕过JAXB使用的命名约定。我个人未亲自尝试的一些选项将遵循已接受的答案或this SO question的最高投票答案。

另一种选择是创建一个XJC插件。虽然这可能是矫枉过正的。 (我目前正在开发一个XJC插件,所以我有偏见。)

Tutorial that helped me getting started with XJC Plugins.

该插件的代码可以做一些事情,几乎看起来像这样:

import com.sun.tools.xjc.Plugin;

public class XJCPlugin extends Plugin {
    @Override
    public String getOptionName() { //... }

    @Override
    public int parseArgument(Options opt, String[] args, int i) throws BadCommandLineException, IOException {
        return 1;
    }

    @Override
    public boolean run(Outline model, Options opt, ErrorHandler errorHandler) throws SAXException {
        //...
    }
    @Override
    public void postProcessModel(Model model, ErrorHandler errorHandler) {
        //This method changes the attribute names
        for (CClassInfo classInfo : model.beans().values()) //for each class
            for (CPropertyInfo propertyInfo : classInfo.getProperties()) //for each attribute
                propertyInfo.setName(false, Utility_StringHandling.firstCharacterToUpperCase(propertyInfo.getName(false)));
    }
    static String firstCharacterToUpperCase(String input) {
        char c[] = input.toCharArray();
        c[0] = Character.toUpperCase(c[0]);
        return new String(c);
    }
}