JAXB和Hibernate - 以编程方式控制输出

时间:2013-11-21 14:10:57

标签: hibernate jaxb moxy

我有许多支持RESTful接口的Hibernate支持的类。我希望默认情况下限制代理对象的输出,同时还支持客户端指定的完整对象数量。

说我有一组这样的课程:

public interface ID
{
    public int getID();
    public void setID(int id);
}

@XmlRootElement
public class Person implements ID
{
    private int id;
    private String name;

    @XmlElement
    public int getID() { return id; }
    public void setID(int id) { this.id = id; }

    @XmlElement
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

@XmlRootElement
public class Record
{
    private Person person;

    @XmlElement
    public Person getPerson() { return person; }
    public void setPerson(Person person) { this.person = person; }
}

PersonRecord都由Hibernate支持,默认情况下代理。当它们被编组为XML时,Hibernate将完全填充对象,输出将如下所示:

<record>
  <person>
    <id>5</id>
    <name>Bob Smith</name>
  </person>
</record>

我想改变它,所以person默认情况下输出中只有id,因此Hibernate不必填充对象。我还想支持在客户端指定时完全填充对象。

我们在getPerson() Record上使用了自定义注释,并且注释阅读器基本上为基于XmlAdapter的类注入了ID,只返回了getID()的结果。当客户端指定应该完全填充给定项时,逻辑将跳过为该对象注入XmlAdapter。这个实现很丑陋,依赖于JAXB和自定义注释仅存在于字段上,并且需要Sun JAXB实现。我们正在转向MOXy,似乎没有相应的功能。请注意,我们也使用Spring 3.2并且正在升级到Jersey 2.4,如果这对这里的任何内容有帮助的话。

我尝试使用各种形式的XmlAdapterMarshaller.Listener和MOXy ObjectGraph概念,但无法以一般方式使用任何内容。在这里使用XmlAdapter可能是最好的解决方案,但是我们有一个很多类,如PersonRecord,我们无法创建适用于每一个的适配器。 XmlAdapter看起来不像继承,因此仅为ID创建一个不起作用。

有没有人有任何想法?感谢。

0 个答案:

没有答案