2010-12-15 8 views
5

¿Por qué funciona el ejemplo A, mientras que el ejemplo B arroja una excepción "JAXB anotación se coloca en un método que no es una propiedad JAXB"?¿Por qué JAXB no permite anotaciones en getters que todos extraen de la misma variable miembro?

Estoy usando JAX-WS con Spring MVC.

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

Ejemplo 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(); 
} 
} 

Respuesta

5

Creo que los accesores se ignoran si se mira directamente a las variables de instancia y en su ejemplo B no hay variables de instancia reales del nombre correcto. Tienes que decirle explícitamente que use @XmlAccessorType (XmlAccessType.NONE) en la clase y @XmlElement y @XmlAttribute en los métodos get/set. Al menos, eso es lo que terminé haciendo con mi mapeo JAXB.

+2

Bernard usa propiedad como el tipo de acceso, por lo que solo debe verificarse el método get/set. –

+0

Tenías razón, al agregar XmlAccessType.NONE lo solucionó. Ahora no tengo que tener variables de miembro tontas que dupliquen datos que ya tengo. :) –

+3

XmlAccessType.NONE funcionará, pero no es correcto. NINGUNO significa solo mapear lo que está explícitamente anotado. Si usa FIELD o PROPERTY, puede aprovechar el incumplimiento. Sigo creyendo que su problema implicó especificar el acceso a PROPERTY pero anotar campos. –

1

creo para que sea una propiedad adecuada JAXB, se necesitaría setters para ellos, así como captadores. (es probable que también necesite un constructor predeterminado).

+0

No necesita ambos métodos get y set. Una propiedad con solo un getter se considerará solo de escritura. Una propiedad con solo un colocador se considerará de solo lectura. –

+0

@Blaise: De otra forma, ¿seguro? (JAXB básicamente solo sabe sobre métodos anotados ...) –

+1

Solo getter = escribe propiedad en XML solo porque no hay setter para leer desde XML. Solo setter = leer propiedad de XML solo porque no hay getter para obtener datos para escribir en XML. –

2

No he intentado su código todavía, pero es el ejemplo A el que parece incorrecto no B. En el ejemplo A ha especificado el acceso a la propiedad (métodos get/set) pero ha anotado los campos (variables de instancia).

Cuestiones relacionadas