Problema Implementazione Ottieni il servizio di riposo a causa di JaxBexception: IllegalNotationExceptions
-
13-09-2020 - |
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.
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.