2012-10-19 35 views
3

我有一个使用泽西岛的JAX-RS REST服务。我使用JAXB进行JSON编组(即。@XmlRootElement) 其中一种方法返回JPA持久化的对象列表。泽西岛对空列表的响应为空而不是{}

当此列表包含条目时,它的工作方式与我的预期相同。例如:

{"androidDevice":[{"email":"[email protected]","timeCreated":"2012-10-19T 
22:41:26.862+02:00"},{"email":"[email protected]","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; 
    } 
} 
+0

你是如何编组内容给JSON的?泽西只是信使,它被告知发送空。 – smcg

+0

使用JAXB(@XmlRootElement) – dparnas

回答

4

要实现更重要的JSON格式更改,您需要配置Jersey JSON处理器本身。可以在JSONConfiguration实例上设置各种配置选项。然后该实例可以进一步用于创建JSONConfigurated JSONJAXBContext,该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; 
    } 
} 

jersey official document的详细信息。

+0

参考http://java.net/jira/browse/JERSEY-339,你认为这会有所帮助(似乎不是一个相关的配置) – dparnas

+0

你使用什么球衣版本?我使用的是版本1.11。使用自然()配置,我会得到[]空列表。使用默认配置时,我会为空列表获取空值。 – secondflying

+0

使用版本1.14。 JAXBContextREsolver如何在泽西岛(在战争项目中)加入?尝试添加类,但假设我必须在web.xml中配置一些东西 – dparnas

2

当restful service返回null时,我有同样的问题。我所做的只是检查清单大小。如果列表的大小为0,我使用以下内容:

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

它在主体中返回“{}”。我的restkit客户端现在对它感到满意。

+1

与使用'com.sun.jersey.api.json'软件包相比,此解决方案可能被认为是更好的解决方案。 –

+0

需要什么? – Brian