我有一个使用 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;
}
}