Problema na implementação DESCANSAR serviço devido a JAXBException:IllegalAnnotationExceptions

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

Pergunta

Eu estou tendo realmente um problema estranho de execução Java RESTO do serviço.Eu estou tentando receber a seguinte 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;
}

Meu OBTER o resto de serviço tem a seguinte assinatura:

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

Sempre que eu faço uma chamada neste OBTER serviço de eu receber 500 contém erro

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

Eu era capaz de rastreá-la para baixo, para os dois seguintes erros:

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

O mais estranho é que se eu mudar a OBTER assinatura de método para retornar uma Lista recebo 200 com o JSON de vista do objecto que tem todos os campos exceto para o typeName campo.Eu estou supondo que a exceção está, de alguma forma, relacionadas a esse campo.Eu tentei adicionar explícita getters como

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

para tentar forçá-lo a enviar o typeName, este recebe o nome de tipo para a "Lista", versão do método GET, mas ainda retorna 500 para o não de uma lista.O estranho é que eu tenho um outro modelo que se parece exatamente o mesmo como esta e funciona sem problemas.Eu estive batendo a minha cabeça contra isso por um tempo agora, qualquer ajuda será muito apreciada.

Obrigado.

Foi útil?

Solução

A exceção diz claramente que JAXB não pode empacotar sua UniqueIdentifierType, porque o objeto a ser controlado, na verdade, é uma instância da classe reforçada por Javassist (com.rp.central.model.UniqueIdentifierType_$$_javassist_21), e que a classe contém um campo (acrescentado pela Javassist) que não pode ser controlado.Provavelmente, ehancement é feito pela ferramenta ORM.

A solução mais óbvia é a de retornar de uma nova cópia do objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top