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 はデフォルトでプロパティをマップされていると見なすためid、 typeという名前のプロパティがあると見なし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 に答える