我有许多支持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; }
}
Person
和Record
都由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,如果这对这里的任何内容有帮助的话。
我尝试使用各种形式的XmlAdapter
,Marshaller.Listener
和MOXy ObjectGraph概念,但无法以一般方式使用任何内容。在这里使用XmlAdapter
可能是最好的解决方案,但是我们有一个很多类,如Person
和Record
,我们无法创建适用于每一个的适配器。 XmlAdapter
看起来不像继承,因此仅为ID
创建一个不起作用。
有没有人有任何想法?感谢。