2010-12-15 7 views
5

Warum funktioniert Beispiel A, während Beispiel B eine Ausnahme "JAXB-Annotation wird auf eine Methode platziert, die keine JAXB-Eigenschaft" ist?Warum erlaubt JAXB keine Annotationen für Getter, die alle von derselben Member-Variable ziehen?

Ich benutze JAX-WS mit Spring MVC.

Beispiel A

package com.casanosa2.permissions; 

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.PROPERTY) 
@XmlType(name = "FooXMLMapper") 
public class FooXMLMapper implements IFoo { 

@XmlElement 
private final boolean propA; 

@XmlElement 
private final boolean propB; 

public FooMapper(IFoo foo) { 
    propA = foo.getPropA() 
    propB = foo.getPropB() 
} 

public FooMapper() { 
    propA = false; 
    propB = false; 
} 

@Override 
public boolean getPropA() { 
    return propA; 
} 

@Override 
public boolean getPropB() { 
    return propB; 
} 
} 

Beispiel B

@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlType(name = "FooXMLMapper") 
public class FooXMLMapper { 

private final IFoo foo; 

public FooMapper() { 
    foo = new IFoo() { 

    @Override 
    public boolean getPropA() { 
    return false; 
    } 

    @Override 
    public boolean getPropB() { 
    return false; 
    } 

    }; 
} 

public FooXMLMapper(IFoo foo) { 
    this.foo = foo; 
} 

@XmlElement 
public boolean getPropA() { 
    return foo.getPropA(); 
} 

@XmlElement 
public boolean getPropB() { 
    return foo.getPropB(); 
} 
} 

Antwort

5

Ich glaube, die Accessoren werden ignoriert, wenn es direkt auf die Instanzvariablen schaut und in Ihrem Beispiel B gibt es keine tatsächlichen Instanzvariablen des richtigen Namens. Sie müssen es explizit anweisen, @XmlAccessorType (XmlAccessType.NONE) für die Klasse und @XmlElement und @XmlAttribute für die Get/Set-Methoden zu verwenden. Zumindest habe ich das mit meinem JAXB-Mapping gemacht.

+2

Bernard verwendet Eigenschaft als Zugriffstyp, daher sollte nur die get/set-Methode überprüft werden. –

+0

Sie hatten Recht, das Hinzufügen von XmlAccessType.NONE wurde behoben. Jetzt brauche ich keine dummen Membervariablen, die Daten duplizieren, die ich bereits habe. :) –

+3

XmlAccessType.NONE wird funktionieren, aber es ist nicht korrekt. NONE bedeutet, nur das zu zeichnen, was explizit mit Anmerkungen versehen ist. Wenn Sie FIELD oder PROPERTY verwenden, können Sie die Standardwerte nutzen. Ich glaube immer noch, dass Ihr Problem darin besteht, den Zugriff auf PROPERTY zu spezifizieren, aber Felder mit Anmerkungen zu versehen. –

1

Ich glaube, für sie eine richtige JAXB Eigenschaft sein, würden Sie Setter für sie sowie Getter müssen. (Sie würden wahrscheinlich auch einen Standardkonstruktor benötigen).

+0

Sie müssen nicht beide Methoden abrufen und setzen. Eine Eigenschaft mit nur einem Getter wird als schreibgeschützt betrachtet. Eine Eigenschaft mit nur einem Setter wird als schreibgeschützt betrachtet. –

+0

@ Blaise: Anders herum, sicher? (JAXB kennt im Grunde nur annotierte Methoden ...) –

+1

Nur Getter = Eigenschaft nur in XML schreiben, da kein Setzer aus XML gelesen werden kann. Nur Setter = liest die Eigenschaft nur aus XML, da kein Getter zum Abrufen von Daten zum Schreiben in XML vorhanden ist. –

2

Ich habe Ihren Code noch nicht getestet, aber es ist Beispiel A, das nicht falsch aussieht. In Beispiel A haben Sie den Zugriff auf Eigenschaften (get/set-Methoden) angegeben, aber die Felder kommentiert (Instanzvariablen).