【问题标题】:Make xjc generate class with member variable names exactly same as element names使xjc生成成员变量名称与元素名称完全相同的类
【发布时间】:2016-05-10 09:16:40
【问题描述】:

有没有办法在外部绑定中指定生成的类中的成员变量名称应在模式级别(即不是全局绑定)上遵循相同的字母大小写(而不是 java 约定)?

我在架构中有名为 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。

【问题讨论】:

    标签: java jaxb xjc xjb


    【解决方案1】:

    xjc 的 OpenJDK 实现使用com.sun.xml.internal.bind.api.impl.NameConverter#toVariableName 将属性名称转换为成员变量名称。似乎没有任何实现可以保持变量名“原样”。如果适用,您可以编写 own xjc plugin,这会将私有属性名称设置为其公共名称。插件可能是这样的:

    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;
        }
    }
    

    【讨论】:

    • 感谢您的建议。但我不认为我可以在现有项目中使用我自己的实现。直到现在我才理解了 jaxb 绑定元素 property 的实际作用,它仅使用遵循命名约定的名称。
    猜你喜欢
    • 2021-02-13
    • 2013-08-05
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多