Проблема с реализацией службы GET REST из-за JAXBException:IllegalAnnotationExceptions

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

Вопрос

У меня действительно странная проблема с реализацией службы Java REST.Я пытаюсь получить следующую модель:

@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;
}

Моя служба отдыха GET имеет следующую подпись:

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

Всякий раз, когда я вызываю эту службу GET, я получаю ошибку 500, содержащую

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

Мне удалось отследить это до следующих двух ошибок:

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

Странно то, что если я изменю подпись метода GET, чтобы вернуть список, я получу 200 с представлением JSON объекта, который имеет все поля. за исключением поля typeName.Я предполагаю, что исключение каким-то образом связано с этим полем.Я пробовал добавлять явные геттеры, такие как

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

чтобы попытаться заставить его отправить имя типа, это помещает имя типа в «Списковую» версию метода GET, но все равно возвращает 500 для версии без списка.Странно то, что у меня есть другая модель, которая выглядит точно так же, как эта, и работает без проблем.Я уже некоторое время бьюсь об это головой, любая помощь будет принята с благодарностью.

Спасибо.

Это было полезно?

Решение

Исключение ясно говорит о том, что JAXB не может маршалировать ваши UniqueIdentifierType, поскольку маршалируемый объект на самом деле является экземпляром класса, улучшенного Javassist (com.rp.central.model.UniqueIdentifierType_$$_javassist_21), и этот класс содержит поле (добавленное Javassist), которое невозможно маршалировать.Вероятно, улучшение выполняется вашим инструментом ORM.

Наиболее очевидное решение — вернуть новую копию объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top