1

我有一个名为 ContentProviderBean 的抽象类,然后是一个扩展抽象类的 java bean(为简单起见,称之为 ExtendsContentProviderBean)以包含其他字段。

我想生成一个 Json 响应,其中包含父级以及子级的额外字段。所以我做了一个 ObjectResponse,它应该这样做如下:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectResponse {

    @XmlElement
    private String result;
    @XmlElement
    private ContentProviderBean object;

    public void setResult(String result) {
        this.result = result;
    }

    public void setObject(ContentProviderBean object) {

        System.err.println("ContentProviderBean::: " + object);

        this.object = object;
    }

}

setObject 中的 System.err 行成功显示了子类 ContentProviderBean (ExtendContentProviderBean) 的所有字段,但 Json 响应仅包含父类 (ContentProviderBean) 的字段。

以下代码是我正在使用的测试代码的一部分,它运行上述生产中的代码。 它使用微型 java 服务器 tjws,以及 ClientRequest 和 ClientResponse (org.jboss.resteasy.client.ClientRequest)。

@Test
public void testObjectEndpoint() throws Exception{

    final String contentEndpoint = ENDPOINT + "/object/{guid}";

    logger.info("testing endpoint: " + contentEndpoint);

    ClientRequest request = new ClientRequest(contentEndpoint);

    request     .pathParameter("guid", "SOMEGUID_25")
                .accept(MediaType.APPLICATION_JSON);

    ClientResponse<String> response = request.get(String.class);

    System.err.println(response.getEntity());

    logger.info("Response Entity:: JSON: " + response.getEntity());

}

真正的实现使用了Jackson,并且成功返回了正确的Json对象。 也就是说,它包括父字段,以及 ExtendsContentProviderBean 中的字段。

那么为什么测试用例没有返回正确的 JSON 对象作为使用 Jackson 的实际实现呢?

编辑:我被要求展示示例 Json。

这是来自 testObjectEndpoint() 方法的示例 Json

{
   "result":"success",
   "object":{
      "creationDate":"2013-09-10T16:08:00-04:00",
      "defaultImg":"http:\/\/someurl2",
      "objectId":25,
      "securityDescriptor":"sec desc 2",
      "title":"title 2",
      "userId":"user id 22"
   }
}

这是 Jackson 提供程序返回的 Json:

{
   "result":"success",
   "object":{
      "objectId":"25",
      "userId":"user id 22",
      "creationDate":1378843680000,
      "securityDescriptor":"sec desc 2",
      "title":"title 2",
      "defaultImg":"http://someurl2",
      "contentType":"CONTENT",
      "size":3,
      "lastEditDate":1378843680000
   }
}

请注意,杰克逊返回 Json 中的最后两个字段来自子类。

4

0 回答 0