2013-05-15 41 views
3

我有一个抽象类: JaxB不能转换为java.lang.Integer

@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) 

**

Can Any one help me?

+0

您使用该JAXB的实施?此代码适用于JDK(6&7)JAXB实现(除非您在ID元素中看到名称空间定义) –

回答

3

By default when your JAXB (JSR-222) implementation is creating metadata for Pessoa它也将为超类BaseEntity创建元数据。由于默认情况下JAXB将属性视为映射,因此它将认为它具有类型的名为id的属性。当JAXB不知道属性的类型时,它会将其转换为DOM Element。这导致ClassCastException

解决方案

该解决方案实际上取决于你是否希望在继承层次的BaseEntity认为一部分(见:http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)。但我会建议要么利用@XmlTransient@XmlAccessorType(XmlAccessType.NONE)BaseType删除有问题的性质:

相关问题