我有两个类: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方法。但是在相同的方法/属性上使用这些注释会导致IllegalAnnotationsException:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 14 counts of IllegalAnnotationExceptions
有可能解决这个问题吗?
答案 0 :(得分:1)
解决!问题不是JPA和JAXB注释之间的冲突。问题出在JAXB上下文的冲突中:@XmlAccessorType(XmlAccessType.FIELD)
PersonAdapter
上的公共getter Person
提供了我的服务的JAXB上下文从其他上下文访问Person对象。并且Person类对于我的上下文是未知的。我用XmlAccessType.FIELD
替换XmlAccessType.NONE
解决了这个问题。也可以使用@XmlTransient
完成。