Как отключить соглашения об именах Java в xjc? - PullRequest
6 голосов
/ 07 июня 2011

Например, sOmE_PROPerty в xsd должно быть sOmE_PROPerty в классе java, а не someProperty.

Я пытался использовать globalBindings enableJavaNamingConventions = "false", но это не работает.

Ответы [ 2 ]

10 голосов
/ 08 июня 2011

Вам нужно будет использовать underscoreBinding="asCharInWord" вместо enableJavaNamingConventions="false":

customer.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema 
    targetNamespace="http://www.example.org/customer" 
    xmlns="http://www.example.org/customer"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"> 

    <xsd:complexType name="customer">
                <xsd:sequence>
                    <xsd:element name="sOmE_PROPerty" type="xsd:string"/>
                </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

binding.xml

Файл привязки JAXB используется для настройки преобразования схемы в Java:

<jaxb:bindings 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jaxb:globalBindings underscoreBinding="asCharInWord"/>
</jaxb:bindings>

Вызов XJC

xjc -d out -b binding.xml customer.xsd

Customer

Имена сгенерированных свойств теперь включают символ подчеркивания:

package org.example.customer;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer", propOrder = {
    "sOmEPROPerty"
})
public class Customer {

    @XmlElement(name = "sOmE_PROPerty", required = true)
    protected String sOmEPROPerty;

    public String getSOmE_PROPerty() {
        return sOmEPROPerty;
    }

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

}

Без использования binding.xml

Если вместо этого сделатьследующий вызов XJC:

xjc -d out -customer.xsd

Вы увидите, что сгенерированные свойства не содержат подчеркивания:

package org.example.customer;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer", propOrder = {
    "sOmEPROPerty"
})
public class Customer {

    @XmlElement(name = "sOmE_PROPerty", required = true)
    protected String sOmEPROPerty;

    public String getSOmEPROPerty() {
        return sOmEPROPerty;
    }

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

}
3 голосов
/ 12 июня 2011

Решено путем изменения исходного кода jaxb в классе com.sun.xml.bind.api.impl.NameConverter следующим образом:

public static final NameConverter standard = new Standard();

static class Standard extends NameUtil implements NameConverter {
    public String toClassName(String s) {
        return s;//toMixedCaseName(toWordList(s), true);
    }
    public String toVariableName(String s) {
        return s;//toMixedCaseName(toWordList(s), false);
    }
    public String toInterfaceName( String token ) {
        return token;//toClassName(token);
    }
    public String toPropertyName(String s) {
        String prop = s;//toClassName(s);
        // property name "Class" with collide with Object.getClass,
        // so escape this.
        if(prop.equals("Class"))
            prop = "Clazz";
        return prop;
    }
...