Jersey:实体数据过滤和继承的字段

时间:2013-12-02 16:05:39

标签: java reflection jersey moxy

泽西手册中有关实体数据过滤的章节显示了示例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没有非基本类型。请注意barParent中的其他字段正确编组到JSON输出中(在本例中使用MOXy),因此我们知道JAXB正在工作。

是否故意无法访问继承的字段?我想在此逻辑中检查父类中的字段,并执行Jersey ObjectGraph到MOXy等效的手动转换,但要么包含或删除调用者指定的字段。如果我无法访问输出中包含的每个字段,我就无法执行此操作。

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

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我已经提出了解决此问题的请求,目前正在等待我的OCA清除。希望它出现在2.7版本中......

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