我有2个类:Person和PersonAdapter。人员是从 wsdl 生成的,无法更改。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Person")
public class Person {
@XmlAttribute(name = "name")
protected String name;
// getters and setters
}
PersonAdapter 是 Person 的对象适配器,具有一些附加属性。此类的对象提供给我的服务的客户端。我将所有 JPA 和 JAXB 注释添加到 PersonAdapter 类中,因为我无法更改 Person 类。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Person")
@Entity
@Table(name = "T_PERSON")
public class PersonAdapter {
private final Person person;
@XmlAttribute(name = "description")
private String description;
@XmlAttribute(name = "name", required = true)
@Column(name = "C_NAME")
public String getName() {
return person.getName();
}
@Column(name = "C_DESCRIPTION")
public String getDescription() {
return description;
}
// getters, setters, contructors
}
我无法注释名称属性,因为它在 Person 类中,所以我使用 JAXB 和 JPA 注释注释 getName 方法。但是,在同一方法/属性上使用这些注释会导致非法注释异常:
由以下原因引起:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 14 个非法注释异常
有可能解决这个问题吗?
解决了!这个问题在 JPA 和 JAXB 注释之间并不冲突。问题出在 JAXB 上下文冲突中:@XmlAccessorType(XmlAccessType.FIELD)
on PersonAdapter
与 Person
的公共获取者一起提供从其他上下文访问我的服务的 JAXB 上下文到 Person 对象的访问。对于我的上下文,人员类是未知的。我解决了这个问题,用XmlAccessType.NONE
替换XmlAccessType.FIELD
.也可以用 @XmlTransient
.