同一类中的JPA和JAXB注释会导致com.sun.xml.bind.v2.runtime.IllegalAnnotationsException

时间:2016-01-28 09:49:44

标签: jpa jaxb annotations

我有两个类: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

有可能解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

解决!问题不是JPA和JAXB注释之间的冲突。问题出在JAXB上下文的冲突中:@XmlAccessorType(XmlAccessType.FIELD) PersonAdapter上的公共getter Person提供了我的服务的JAXB上下文从其他上下文访问Person对象。并且Person类对于我的上下文是未知的。我用XmlAccessType.FIELD替换XmlAccessType.NONE解决了这个问题。也可以使用@XmlTransient完成。