# JAXB: automatisches Groß schreiben Property



## meikmeik (7. Aug 2012)

Heho,

habe hier ein Problem mit JAXB.

in meiner XSD habe ich ein Property: xx_xxxxxx
Jaxb denkt es müsste daraus: xx_*X*xxxxx machen.

Gibt es einen Weg, wie man das verhindern kann.

Um die Unterstriche zu erhalten benutze ich 

<jxb:globalBindings underscoreBinding="asCharInWord" >

Über einen Lösungsvorschlag wäre ich sehr erfreut.
Zur Not würde ich auch die Methode direkt in JAXB überschreiben, wenn jemand weiß wie diese heist.

Meik wars


----------



## mvitz (7. Aug 2012)

Kannst du evtl. mal den Auszug der XSD und des Binding Files posten, dann gucke ich mir das mal an.


----------



## meikmeik (7. Aug 2012)

*Auszug aus der XSD*

[XML]
<xs:element name="hi_eintragsdatum" nillable="true" sql:relation="xxx" sql:field="hi_eintragsdatum" sql:datatype="datetime">
	<xs:simpleType>
		<xs:restriction base="xs:dateTime">
			<xsattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}T\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}"/>
				</xs:restriction>
	</xs:simpleType>
</xs:element>
[/XML]

*BINDING:*
[XML]
<jxb:bindings version="2.0" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:ext="http://xml.w-wins.com/xjc-plugins/interfaces"
  jxb:extensionBindingPrefixes="xjc">
    <jxb:bindings schemaLocation="../mud/XXX.xsd" node="xs:schema">
		<jxb:globalBindings underscoreBinding="asCharInWord" >
			<jxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.xxx.cat.eingabe.unternehmen.utils.JAXBConverterDate.parseDate" printMethod="com.xxx.cat.eingabe.unternehmen.utils.JAXBConverterDate.printDate"/>
		</jxb:globalBindings>

			<jxb:schemaBindings>
				<jxb:nameXmlTransform>
					<jxb:elementName suffix="Base" />
				</jxb:nameXmlTransform>
			</jxb:schemaBindings>
    </jxb:bindings>
</jxb:bindings>
[/XML]

*RESULTAT:*

    @XmlElement(name = "hi_eintragsdatum", required = true, type = String.class, nillable = true)
    @XmlJavaTypeAdapter(Adapter1 .class)
    protected Date hiEintragsdatum;


--------------------------------------------------------------------------------------------------------------------------
@XmlElement(name = "hi_eintragsdatum" -> *ist korrekt*

protected Date hiEintragsdatum; -> *ist falsch*


Ist alles Korrekt(Klassenname, getter setter) bis auf die Properties.


----------



## mvitz (7. Aug 2012)

Was genau stört dich daran?

JAXB versucht in den generierten Javaklassen sich an die gängigen Java-Standards zu halten. Da in diesen der _ nicht benutzt werden sollte, macht dies JAXB auch nicht.

Wenn du den Objektbaum letztlich serialisierst, nutzt JAXB den Wert von @XmlElement(name) um das XML zu generieren, d.h. das serialisierte XML genügt dem Schema.


----------



## meikmeik (7. Aug 2012)

Das Problem ist, dass er die Property einfach umbennent, es muss doch eine Möglichkeit geben dies zu unterbinden, Konvention hin oder her.
Das ist ja wie die Frage nach der { Klammer, darum sollte es ja nicht gehen.


----------



## Noctarius (7. Aug 2012)

Aber wieso ist dir die Schreibweise der Properties wichtig, wenn du Getter / Setter hast (und diese hoffentlich auch nutzt)?

Da generierter Code normalerweise nur in Ausnahmefällen in ein Code-Repository gehört, who cares?


----------



## meikmeik (7. Aug 2012)

XSD aus Db erstellen;
Klassen aus XSD generieren;
Klassen befüllen:
Klassen der Speicherklasse übergeben,
Werte sind in der DB.

Speicherklasse braucht diese richtig geschriebenen Props sonst funzt das mapping nicht.

Für mich gibt es keinen ersichtlichen Grund warum JAXB meine Props umbenennt, bzw in JAVA Standards konvertiert wenn ich das nicht will, sowas muss man doch ausstellen können.

Bitte keine Gegenfragen stellen sondern versuchen das Problem zu beheben.


----------



## Noctarius (7. Aug 2012)

Ok dann keine Gegenfrage:
Sicherlich kann man das Abstellen, wie das geht verrät sicher auch der Source der JAXB Implementierung die du nutzt. Da das Verhalten nicht zum Standard gehört wird es, wenn implementiert, in jeder Implementierung anders aussehen.

Alternativ sollte man überlegen wieso man überhaupt nicht standardkonformes Verhalten will. Generell erhöht das nur Einarbeitungsaufwand für Neulinge. Und ob der Grund für dich ersichtlich ist oder nicht spielt erstmal keine Rolle. JAXB ist ein Standard und hält sich als solcher an die Java Standards (alles andere wäre sinnfrei).

Wer auf interne Details achtet ist halt selber Schuld, wer sagt dir denn, dass der Generator in der nächsten Version nicht "mPropertyName" aus den Properties macht? Solange nur externes Verhalten dokumentiert und spezifiziert ist darf meine Implementierung intern machen was sie will und wenn ich die Daten über 100 Klassen verteilen möchte darf ich das auch.

Wenn man mehrere Dinge integrieren möchte muss man halt eventuell schon mal selber Hand anlegen.


----------



## meikmeik (7. Aug 2012)

Warum schafft JAXB den Underscore überall ohne ändern zu lassen nur bei den Props nicht.
Wo ist das ein Standard wenn man es ausschalten kann aber er es nicht überall macht ?
Gibt es dazu eine Erklärung die ich nicht nicht gefunden habe.

<jxb:globalBindings underscoreBinding="asCharInWord" >

Underscore oder nicht ist für mich wirklich eine Glaubensfrage, ähnlich { oder Tab oder Leerzeichen


----------



## Noctarius (7. Aug 2012)

Spezifiziert ist das externe API welches die Klasse zur Verfügung stellen muss, frei implementierbar die interne Umsetzung. Was ist daran so schwer zu verstehen?

Versuch halt eine andere JAXB Implementierung oder bau dir deinen eigenen Generator wenn du so einen Wert darauf legst...


----------

