Quarkus Panache实体上的JAXB批注导致REST调用失败

时间:2019-12-08 08:46:01

标签: java jaxb quarkus

我已将一个类注释为Panache实体。但是,我还包括了JAXB批注:

@Entity
@XmlRootElement(name = "Person")
@XmlAccessorType(XmlAccessType.NONE)
public class Person extends PanacheEntity {

    @XmlAttribute(name = "Name")
    public String name;
}

当我尝试从REST调用返回对象时,出现以下异常:

2019-12-08 08:30:01,917 ERROR [org.jbo.res.res.i18n] (vert.x-worker-thread-3) RESTEASY002005: Failed executing GET /person: org.jboss.resteasy.plugins.providers.jaxb.JAXBMarshalException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
model.Person#name has mutually exclusive annotations @javax.xml.bind.annotation.XmlTransient and @javax.xml.bind.annotation.XmlAttribute
    this problem is related to the following location:
        at @javax.xml.bind.annotation.XmlTransient()
        at model.Person
    this problem is related to the following location:
        at @javax.xml.bind.annotation.XmlAttribute(namespace="##default", name="Name", required=false)
        at model.Person

    at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.getMarshaller(AbstractJAXBProvider.java:187)
    at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.writeTo(AbstractJAXBProvider.java:149)

因此,似乎Quarkus Panache框架正在将@XmlTransient添加到我的公共属性中。

我可以通过将name属性的访问权限更改为private并包括getter / setter来解决此问题。但是,这种方法失去了Panache的优势之一,即您的代码更加紧凑和可读。

是否仍然要保留class属性的公共访问器,并且仍使其可与JAXB一起使用?

1 个答案:

答案 0 :(得分:1)

有趣的用例。

我认为,在自动添加@XmlTransient之前,我们需要检查属性是否没有任何冲突的JAXB注释。

我们做同样的事情,这可能也是JSON-B / Jackson的问题。

我看不到任何明显的解决方法:我们需要在Quarkus中对其进行修复。

您能用一个简单的复制器打开GitHub问题吗?谢谢!