【发布时间】:2012-10-19 20:45:11
【问题描述】:
我有一个使用 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
更新2: 除了下面的解决方案之外,由于我使用的是应用程序进行配置(在 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;
}
}
【问题讨论】:
-
您如何将内容编组为 JSON? Jersey 只是信使,它被告知发送 null。