gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:34 25 4
gpt4 key购买 nike

我在实现 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 View ,该对象具有除 typeName 字段之外的所有字段。我猜测该异常与该领域有某种关系。我尝试添加显式 setter/getter ,例如

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

为了尝试强制它发送 typeName,这会将类型名称获取到 GET 方法的“列表”版本中,但对于非列表版本仍返回 500。奇怪的是,我有另一个模型,它看起来与这个完全一样,并且工作没有任何问题。我已经为此苦苦挣扎了一段时间,任何帮助将不胜感激。

谢谢。

最佳答案

该异常清楚地表明 JAXB 无法编码(marshal)您的 UniqueIdentifierType,因为正在编码(marshal)的对象实际上是 Javassist 增强的类的实例 (com.rp.central.model.UniqueIdentifierType_$$_javassist_21),并且该类包含一个无法编码(marshal)的字段(由 Javassist 添加)。也许,增强是由您的 ORM 工具完成的。

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

关于java - 由于 JAXBException : IllegalAnnotationExceptions,实现 GET REST 服务时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com