Problema al implementar el servicio GET REST debido a JAXBException:Excepciones de anotaciones ilegales

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

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top