我在实现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方法签名以返回List,那么我将获得具有对象的JSON视图的200,该视图具有除了typeName字段之外的所有字段。我猜这个异常与该字段有某种关系。我尝试过添加明确的getter,例如
@XmlElement(name="typeName")
public String getTypeName() {
return typeName;
}
尝试强制它发送typeName,这会将类型名称转换为GET方法的“List”版本,但仍然为非列表类型返回500。奇怪的是,我有另一个看起来与这个完全相同的模型并且没有任何问题。我一直在抨击这个问题已经有一段时间了,任何帮助都将不胜感激。
谢谢。
答案 0 :(得分:1)
该异常清楚地表明JAXB无法封送您的UniqueIdentifierType
,因为正在编组的对象实际上是Javassist(com.rp.central.model.UniqueIdentifierType_$$_javassist_21
)增强的类的实例,并且该类包含一个字段(由Javassist添加)无法编组。可能是你的ORM工具完成了增强。
最明显的解决方案是返回对象的新副本。