Jersey:实体数据筛选和继承字段



Jersey手册中关于实体数据筛选的章节在示例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;
   // ...
}

如果我在上面的preWriteTo()中调用objectGraph.getFields(),我将在Child中看到baz字段,但在Parent中看不到bar字段。同样,如果我循环浏览objectGraph.getSubgraphs()的内容,我将从Child看到foo,但从Parent看不到非基元类型。请注意,barParent中的其他字段被正确地编组到JSON输出中(在本例中使用MOXy),因此我们知道JAXB正在工作。

缺乏对继承字段的访问权限是故意的吗?在这个逻辑中,我想检查父类中的字段,并手动将Jersey ObjectGraph转换为MOXy等价物,但根据调用方的指定包括或删除字段。如果我不能访问输出中包含的每个字段,我就无法做到这一点。

请注意,我使用的是Jersey 2.4和MOXy 2.5.1。

检查Java反射apihttp://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() 获取所需的所有信息

我已经提出了一个修复请求,目前正在等待我的OCA清除。希望它在2.7版本中。。。

https://github.com/jersey/jersey/pull/68

最新更新