空单泽西反应是空的,而不是{}(Jersey response for empty list is

2019-08-01 16:54发布

我有使用新泽西州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。 例:

$ 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;
}

有没有什么办法让泽西岛返回一个空的JSON列表(除了硬编码一个ResponseBuilder)?

我应该代替提供这样的事件不同的响应代码?

更新:得到通过Twitter有关此错误的报告,该报告与总结他们不会修复它提示http://java.net/jira/browse/JERSEY-339

UPDATE2:除了下面的解决方案,因为我使用用于配置的应用(refered 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;
    }   
}

Answer 1:

为了达到更重要的JSON格式的变化,你需要配置泽西JSON。处理器本身。 各种配置选项可以在一个JSONConfiguration实例设置。 实例可以然后进一步用于创建JSONConfigurated JSONJAXBContext,作为在这方面的一个主要配置点。 要通过你的专业JSONJAXBContext泽西岛,你将最终需要实现的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;
    }
}

指的球衣正式文件的详细信息。



Answer 2:

我有同样的问题,当RESTful服务返回NULL。 我所做的是检查列表的大小。 如果列表的大小为0,我使用以下命令:

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

它返回身体“{}”。 我restkit客户端现在是满意的。



Answer 3:

我遇到了同样的问题。 在Jersey 1.09空数组被作为null而填充的阵列被正确写入。 现在我用球衣1.19.4在这个版本中一个空数组被正确地写为{}



文章来源: Jersey response for empty list is null instead of {}
标签: rest jersey