Заставить xjc генерировать класс с именами переменных-членов точно такими же, как имена элементов

Есть ли способ указать во внешней привязке, что имена переменных-членов в сгенерированных классах должны следовать одному и тому же буквенному регистру (а не соглашениям java) на уровне схемы (т. Е. Не globalbinding)?

У меня есть элементы, названные как XYZProperty в схеме, которая должна иметь соответствующую переменную-член, названную как сам XYZProperty, а не xyzProperty. Я попытался добавить следующее в файл привязки, но это не сработало:

<jxb:bindings node="//xsd:complexType[@name='SomeType']/xsd:sequence/xsd:element[@name='XYZProperty']">
    <jxb:property name="XYZProperty"/>
</jxb:bindings>

где //xsd:complexType[@name='SomeType']/xsd:sequence/xsd:element[@name='XYZProperty'] - это xpath к элементу в схеме.

1 ответ

Реализация OpenJDK xjc использует com.sun.xml.internal.bind.api.impl.NameConverter#toVariableName преобразовать имя свойства в имя переменной члена. Кажется, что нет реализации, которая могла бы оставить имя переменной "как есть". Если это применимо, вы можете написать свой собственный плагин xjc, который установит в качестве имени частного свойства его публичное имя. Плагин может быть таким:

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;

import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.Plugin;
import com.sun.tools.xjc.model.CClassInfo;
import com.sun.tools.xjc.model.CPropertyInfo;
import com.sun.tools.xjc.model.Model;
import com.sun.tools.xjc.outline.Outline;

public class XJCPlugin extends Plugin {
    @Override
    public String getOptionName() {
        return "XsameElementNames";
    }

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

    @Override
    public String getUsage() {
        return "  -XsameElementNames    :  set property private name as its public name";
    }

    @Override
    public void postProcessModel(Model model, ErrorHandler errorHandler) {
        for (CClassInfo c : model.beans().values()) {
            for (CPropertyInfo prop : c.getProperties()) {
                prop.setName(false, prop.getName(true));
            }
        }
    }

    @Override
    public boolean run(Outline arg0, Options arg1, ErrorHandler arg2) throws SAXException {
        return true;
    }
}
Другие вопросы по тегам