Problema Implementazione Ottieni il servizio di riposo a causa di JaxBexception: IllegalNotationExceptions

StackOverflow https://stackoverflow.com/questions/3213908

Domanda

Sto avendo un problema davvero strano implementazione del servizio di riposo Java. Sto provando a ricevere il seguente modello:

@Data @EqualsAndHashCode(callSuper=false, of={"primaryKey"}) 
@Entity @Table(name = "T_UNIQUE_IDENT_TYPE")
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@XmlRootElement(name="UniqueIdentifierType") @XmlAccessorType(XmlAccessType.FIELD)
public class UniqueIdentifierType extends AbstractEntityWithTime implements Serializable {
    private static final long serialVersionUID = 1L;    
    @Id @Basic(optional = false) @Column(name = "F_TYPE_PK") @XmlTransient
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="S_UNIQUE_IDENT_TYPE") @SequenceGenerator(name="S_UNIQUE_IDENT_TYPE",sequenceName="S_UNIQUE_IDENT_TYPE") 
    private Long primaryKey;
    @Column(name = "F_NAME", nullable=false, length=50)
    private String typeName;
    @Basic(optional = false) @Column(name = "F_CREATION_TIME") @Temporal(TemporalType.TIMESTAMP) @XmlTransient
    private Calendar creationTime;
    @Basic(optional = false) @Column(name = "F_LASTMODIFY_TIME") @Temporal(TemporalType.TIMESTAMP) @XmlTransient
    private Calendar lastModifyTime;
    @JoinColumn(name = "F_UNIT_PK", referencedColumnName = "F_UNIT_PK") @ManyToOne(optional = false) @XmlTransient
    private SoftwareProviderUnit softwareProviderUnit;
}
.

Il mio servizio di riposo ottiene la seguente firma:

@GET 
@Path("/{name}") 
public UniqueIdentifierType get(@PathParam("unitId") final Long unitId, @PathParam("name") final String name) throws WebApplicationException {
.

Ogni volta che faccio una chiamata su questo servizio ricevo ricevo 500 errori contenenti

java.lang.AssertionError: JAXBException occurred : 2 counts of IllegalAnnotationExceptions
.

Sono stato in grado di rintracciarlo ai seguenti due errori:

javassist.util.proxy.MethodHandler is an interface, and JAXB can't handle interfaces.
    this problem is related to the following location:
        at javassist.util.proxy.MethodHandler
        at private javassist.util.proxy.MethodHandler com.rp.central.model.UniqueIdentifierType_$$_javassist_21.handler
        at com.rp.central.model.UniqueIdentifierType_$$_javassist_21

javassist.util.proxy.MethodHandler does not have a no-arg default constructor.
    this problem is related to the following location:
        at javassist.util.proxy.MethodHandler
        at private javassist.util.proxy.MethodHandler com.rp.central.model.UniqueIdentifierType_$$_javassist_21.handler
        at com.rp.central.model.UniqueIdentifierType_$$_javassist_21
.

La cosa strana è che se modifico la firma del metodo GET per restituire un elenco ottenuto 200 con la vista JSON dell'oggetto che ha tutti i campi tranne per il campo Typename . Immagino che l'eccezione sia in qualche modo correlata a quel campo. Ho provato ad aggiungere getter esplicito come

@XmlElement(name="typeName")
public String getTypeName() {
    return typeName;
}
.

Per provare a costringerlo a inviare il typename, questo ottiene il nome del tipo nella versione "Elenco" del metodo GET, ma restituisce ancora 500 per il non elenco. La cosa strana è che ho un altro modello che sembra esattamente lo stesso di questo e funziona senza problemi. Ho sbattuto la testa contro questo per un po 'ora, qualsiasi aiuto sarà molto apprezzato.

Grazie.

È stato utile?

Soluzione

L'eccezione afferma chiaramente che Jaxb non può sostenere il tuo UniqueIdentifierType, poiché l'oggetto che viene marshalled è in realtà un'istanza della classe migliorata da javassist (com.rp.central.model.UniqueIdentifierType_$$_javassist_21), e quella classe contiene un campo (aggiunto da Javassist) che non puòessere marshalling.Probabilmente, eHancement è fatto dallo strumento Orm.

La soluzione più ovvia è quella di restituire una nuova copia dell'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top