3

我有一个抽象类:

@MappedSuperclass
public abstract class BaseEntity<K> 
{

@Temporal(value = TemporalType.TIMESTAMP)
private Date cadastrado;
@Temporal(value = TemporalType.TIMESTAMP)
private Date modificado;
@Column(length = 30)
private String ip;
private String autorModificacao;

public abstract K getId();

public abstract void setId(K id);

...

and a derived class:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Pessoa extends BaseEntity<Integer> implements Serializable {

    @Id
    @ColumnGridPF
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "pessoa")
    private Integer id;

....

@Override
Integer getId() {
  return id;
}

    @Override
    public void setId(Integer id) {
        this.id = id;
    }

....

when my application try to unmarshall the object, I get an error

**

SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to java.lang.Integer
    at br.com.sigmaonline.entity.cadastro.pessoa.Pessoa.setId(Pessoa.java:46)
    at br.com.sigmaonline.entity.common.generic.BaseEntity$JaxbAccessorM_getId_setId_java_lang_Object.set(MethodAccessor_Ref.java:60)

**

谁能帮我?

4

1 回答 1

3

默认情况下,当您的JAXB (JSR-222)实现为它创建元数据时,Pessoa它也会为超类创建元数据BaseEntity。由于默认情况下 JAXB 将属性视为已映射,因此它会认为它有一个名为idtype的属性Object。当 JAXB 不知道属性的类型时,它会将其转换为 DOM Element。这导致ClassCastException.

解决方案

解决方案实际上取决于您是否希望BaseEntity将其视为继承层次结构的一部分(请参阅: http ://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html )。但我建议的是利用或@XmlTransient删除有问题的属性:@XmlAccessorType(XmlAccessType.NONE)BaseType

于 2013-05-15T13:15:51.253 回答