Problema al implementar el servicio GET REST debido a JAXBException:Excepciones de anotaciones ilegales
-
13-09-2020 - |
Pregunta
Tengo un problema realmente extraño al implementar el servicio REST de Java.Estoy intentando recibir el siguiente modelo:
@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;
}
Mi servicio de descanso GET tiene la siguiente firma:
@GET
@Path("/{name}")
public UniqueIdentifierType get(@PathParam("unitId") final Long unitId, @PathParam("name") final String name) throws WebApplicationException {
Cada vez que hago una llamada a este servicio GET recibo un error 500 que contiene
java.lang.AssertionError: JAXBException occurred : 2 counts of IllegalAnnotationExceptions
Pude rastrearlo hasta los dos errores siguientes:
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
Lo raro es que si cambio la firma del método GET para devolver una Lista obtengo 200 con la vista JSON del objeto que tiene todos los campos. excepto el campo typeName.Supongo que la excepción está relacionada de alguna manera con ese campo.Intenté agregar captadores explícitos como
@XmlElement(name="typeName")
public String getTypeName() {
return typeName;
}
para intentar forzarlo a enviar el nombre del tipo, esto obtiene el nombre del tipo en la versión "Lista" del método GET pero aún devuelve 500 para el que no está en la lista.Lo curioso es que tengo otro modelo que es exactamente igual a este y funciona sin problemas.He estado golpeándome la cabeza contra esto por un tiempo, cualquier ayuda será muy apreciada.
Gracias.
Solución
La excepción dice claramente que JAXB no puede ordenar su UniqueIdentifierType
, porque el objeto que se está ordenando es en realidad una instancia de la clase mejorada por Javassist (com.rp.central.model.UniqueIdentifierType_$$_javassist_21
), y esa clase contiene un campo (agregado por Javassist) que no se puede ordenar.Probablemente, la mejora la realiza su herramienta ORM.
La solución más obvia es devolver una copia nueva del objeto.