泽西手册中有关实体数据过滤的章节显示了示例17.17
中的代码@Inject
private Provider<ObjectProvider<ObjectGraph>> provider;
@Override
protected void preWriteTo(final Object object, final Class<?> type, final Type genericType, final Annotation[] annotations,
final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders,
final Marshaller marshaller) throws JAXBException {
super.preWriteTo(object, type, genericType, annotations, mediaType, httpHeaders, marshaller);
// Entity Filtering.
if (marshaller.getProperty(MarshallerProperties.OBJECT_GRAPH) == null) {
final Object objectGraph = provider.get().getFilteringObject(genericType, true, annotations);
if (objectGraph != null) {
marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, objectGraph);
}
}
}
如果我运行近似等效的代码并查看objectGraph
的内容,我会看到继承的字段不存在。也就是说,上面的genericType
看起来像这样:
public class Child extends Parent {
private String baz;
private Foo foo; // Some non-primitive type.
// ...
}
和Parent
看起来像这样:
public abstract class Parent {
private int bar;
// ...
}
如果我在上面的objectGraph.getFields()
内拨打preWriteTo()
,我会在baz
中看到Child
字段,但bar
会看到Parent
。同样,如果我遍历objectGraph.getSubgraphs()
的内容,我会从foo
看到Child
,但Parent
没有非基本类型。请注意bar
和Parent
中的其他字段正确编组到JSON输出中(在本例中使用MOXy),因此我们知道JAXB正在工作。
是否故意无法访问继承的字段?我想在此逻辑中检查父类中的字段,并执行Jersey ObjectGraph
到MOXy等效的手动转换,但要么包含或删除调用者指定的字段。如果我无法访问输出中包含的每个字段,我就无法执行此操作。
请注意,我使用的是Jersey 2.4和MOXy 2.5.1。
答案 0 :(得分:0)
检查Java反射API http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/package-summary.html
和http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
从objectGraph.getEntityClass()
答案 1 :(得分:0)
我已经提出了解决此问题的请求,目前正在等待我的OCA清除。希望它出现在2.7版本中......