4

我有一个使用 Jersey 的 JAX-RS REST 服务。我使用 JAXB 进行 JSON 编组(即@XmlRootElement) 方法之一返回使用 JPA 持久化的对象列表。

当此列表包含条目时,它会按我的预期工作。例子:

{"androidDevice":[{"email":"dagfinn.parnas@d2.no","timeCreated":"2012-10-19T
22:41:26.862+02:00"},{"email":"dagfinn.parnas@d1.com","timeCreated":"2012-10-
19T22:41:38.093+02:00"}]}

但是,如果列表为空(或 null),我希望它返回 {}。

相反,它返回 null。例子:

$ curl  -i -H "Accept: application/json" http://....
HTTP/1.1 200 OK
Content-Type: application/json

null

这是代码

    @GET
@Produces( { MediaType.APPLICATION_JSON ,  MediaType.APPLICATION_XML})
public List<AndroidDevice> getAndroidDevices() {
    logger.info("getAndroidDevices method called");


    EntityManager entityManager = entityMangerFactory.createEntityManager();  
    List<AndroidDevice> resultList = entityManager.createNamedQuery(AndroidDevice.QUERY_ALL_ENTRIES,  
            AndroidDevice.class).getResultList();  

    //avoid returning content null. (doesn't work)
    if(resultList==null){
        resultList=new ArrayList<AndroidDevice>();
    }

    return resultList;
}

有没有办法让 Jersey 返回一个空的 JSON 列表(除了硬编码一个 ResponseBuilder)?

我应该为此类事件提供不同的响应代码吗?

更新:通过 twitter 获得有关此错误报告的提示,其结论是他们不会修复它http://java.net/jira/browse/JERSEY-339

Update2:除了下面的解决方案之外,由于我使用的是应用程序进行配置(在 web.xml 中引用),因此我不得不在那里手动添加 Provider 类。这是相关的代码。

public class JAXRSApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> set = new HashSet<Class<?>>();
        //Add all endpoints to this set
        set.add(AndroidDeviceEndpoint.class);
        //Add Providers
        set.add(JAXBContextResolver.class);
        return set;
    }   
}
4

3 回答 3

4

要实现更重要的 JSON 格式更改,您需要配置 Jersey JSON 处理器本身。可以在 JSONConfiguration 实例上设置各种配置选项。然后可以进一步使用该实例来创建 JSONConfigurated JSONJAXBContext,作为该区域的主要配置点。要将您的专用 JSONJAXBContext 传递给 Jersey,您最终需要实现一个 JAXBContext ContextResolver:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final JAXBContext context;
    private final Set<Class> types;
    private Class[] ctypes = { AndroidDevice.class}; //your pojo class
    public JAXBContextResolver() throws Exception {
        this.types = new HashSet(Arrays.asList(ctypes));
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(),
                ctypes); //json configuration
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
        return (types.contains(objectType)) ? context : null;
    }
}

详细信息请参阅球衣官方文档

于 2012-10-20T01:32:58.657 回答
2

当 restful 服务返回 null 时,我遇到了同样的问题。我所做的只是检查列表大小。如果列表的大小为 0,我使用以下内容:

return Response.ok("{}", req.getContentType()).status(Response.Status.OK); 

它在正文中返回“{}”。我的 restkit 客户现在对它很满意。

于 2013-01-16T00:39:22.920 回答
2

我遇到了同样的问题。在 Jersey 1.09 中,发送一个空数组,就像null正确写入一个填充数组一样。现在我使用 Jersey 1.19.4,在这个版本中,一个空数组被正确地写为{}.

于 2018-06-05T07:39:08.470 回答