مشكلة في تنفيذ خدمة GET REST بسبب JAXBException:استثناءات التعليقات التوضيحية غير القانونية

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 Rest على التوقيع التالي:

@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