2016-05-10 17 views
0

Gibt es eine Möglichkeit, in externen Bindung anzugeben, dass die Mitgliedsvariablennamen in generierten Klassen die gleiche Groß- und Kleinschreibung (und nicht die Java-Konventionen) für ein Schema folgen Level (also keine globale Bindung)?Machen Sie xjc generieren Klasse mit Elementvariablennamen genau wie Elementnamen

I Elemente wie XYZProperty im Schema benannt habe, die Membervariable entspricht, wie genannt haben sollte XYZProperty selbst und nicht xyzProperty. Ich habe versucht, die folgenden in der Bindungsdatei hinzufügen, aber es hat nicht funktioniert:

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

wo // xsd: complex [@ name = 'Sometype']/xsd: sequence/xsd: element [@name = 'XYZProperty'] ist der xpath zu dem Element im Schema.

Antwort

1

Die OpenJDK-Implementierung von xjc verwendet com.sun.xml.internal.bind.api.impl.NameConverter#toVariableName, um den Eigenschaftsnamen in den Namen der Mitgliedsvariablen zu konvertieren. Es scheint, dass es keine Implementierung gibt, die den Variablennamen "so wie er ist" hinterlassen kann. Wenn es anwendbar ist, können Sie Ihre own xjc plugin schreiben, die den Namen der privaten Eigenschaft auf ihren öffentlichen Namen setzt. Plugin kann so sein:

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

Vielen Dank für den Hinweis. Aber ich glaube nicht, dass ich meine eigene Implementierung in dem bestehenden Projekt verwenden kann. Erst jetzt habe ich verstanden, was die jaxb binding ** -Eigenschaft ** tatsächlich macht, dass sie den Namen nur nach der Namenskonvention verwendet. –