Java 由于jaxbeexception:IllegalAnnotationExceptions,实现GET-REST服务时出现问题

Java 由于jaxbeexception:IllegalAnnotationExceptions,实现GET-REST服务时出现问题,java,rest,jakarta-ee,jaxb,jaxb2,Java,Rest,Jakarta Ee,Jaxb,Jaxb2,我在实现JavaREST服务时遇到了一个非常奇怪的问题。我正在尝试接收以下型号: @Data @EqualsAndHashCode(callSuper=false, of={"primaryKey"}) @Entity @Table(name = "T_UNIQUE_IDENT_TYPE") @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @XmlRootElement(name="UniqueIdentifierType

我在实现JavaREST服务时遇到了一个非常奇怪的问题。我正在尝试接收以下型号:

@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;
}
My 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字段之外的所有字段。我猜这个异常在某种程度上与这个领域有关。我尝试添加显式getter,例如

@XmlElement(name="typeName")
public String getTypeName() {
    return typeName;
}
为了尝试强制它发送类型名,这会将类型名获取到GET方法的“List”版本中,但对于非List方法仍然返回500。奇怪的是,我有另一个模型,它看起来和这一个完全一样,工作没有任何问题。我已经为此绞尽脑汁一段时间了,任何帮助都将不胜感激


谢谢。

例外情况清楚地表明JAXB无法封送您的
UniqueIdentifierType
,因为封送的对象实际上是Javassist增强的类的实例(
com.rp.central.model.UniqueIdentifierType_$$\uJavassist_21
),并且该类包含一个字段(由Javassist添加)这是无法编组的。也许,ehancement是由您的ORM工具完成的


最明显的解决方案是返回该对象的新副本。

例外情况清楚地表明,JAXB无法封送您的
UniqueIdentifierType
,因为被封送的对象实际上是Javassist增强的类的实例(
com.rp.central.model.UniqueIdentifierType\u$\ uJavassist\u21
),该类包含一个无法封送的字段(由Javassist添加)。也许,ehancement是由您的ORM工具完成的


最明显的解决方案是返回对象的新副本。

谢谢,这很有效!但为什么会发生这种情况呢?我还有其他完全一样的东西,而且很好用。我真的很想保持代码的一致性。@Alex:如果您的
UniqueIdentifierType
是由ORM加载的,它可能与延迟加载配置有关。谢谢,这很有效!但为什么会发生这种情况呢?我还有其他完全一样的东西,而且很好用。我真的很想保持代码的一致性。@Alex:如果您的
UniqueIdentifierType
是由ORM加载的,它可能与延迟加载配置有关。