Jersey 对空列表的响应为 null 而不是 {}

2024-05-19

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

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

{"androidDevice":[{"email":"[email protected] /cdn-cgi/l/email-protection","timeCreated":"2012-10-19T
22:41:26.862+02:00"},{"email":"dagfinn.p[email protected] /cdn-cgi/l/email-protection","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 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 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;
    }
}

参考球衣官方文件 http://jersey.java.net/nonav/documentation/latest/json.html获取详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey 对空列表的响应为 null 而不是 {} 的相关文章

  • 使用资源控制器的存储方法上的 Laravel 5.1 MethodNotAllowedHttpException

    我正在尝试利用资源控制器将记录添加到数据库 但是收到 MethodNotAllowedHttpException 错误 我已经经历过几个类似的问题 比如this https stackoverflow com questions 29327
  • 如何正确处理 JWT 刷新?

    我有一个安卓应用程序 它连接到一个REST API开发与Jersey 我的 REST 端点通过令牌进行保护 下面是我生成它们的方法 Algorithm algorithm Algorithm HMAC256 secret String to
  • 使用 Spring RestTemplate 时忽略 SSL 证书验证

    我正在使用 Spring RestTemplate 发出 HTTPS 请求 并且我想忽略 SSL 证书 这是我创建restTemplate请求的代码 TrustStrategy acceptingTrustStrategy X509Cert
  • 如何进行 REST 式更新?

    如果我有一个对象 请说Employee 我想提供两种不同的更新方式 更新绩效评级或更新联系信息 构建 API 的 REST 式方式是什么 我认为正确的方法是 POST 我担心的是 对于用户来说 首先获取对象的两个部分 绩效评级和联系信息 仅
  • 如何将 REST API 与 FireMonkey 结合使用?

    我需要在 FireMonkey 中实现 REST API 来获取一些信息 但我不确定如何做到这一点 REST API使用OAuth2 我可以访问两个代码 Consumer Key和Consumer Secret 之后 我需要获得一个临时的
  • Azure API Manager 将所有内容公开,摆脱 Ocp-Apim-Subscription-Key

    我有一些通过 Azure API 管理代理的 REST API 出于某种原因 我希望将其公开以应对所有请求 从开发人员的角度来看 我想摆脱在标头 或请求 中设置密钥 Ocp Apim Subscription Key XXXXXXXXXXX
  • 如何触发应用程序通过 REST 服务获取数据?

    我正在寻找一种方法来触发应用程序从远程 REST 服务获取数据 该方法不需要轮询 iOS 推送通知似乎不是一个选项 因为它可以被用户停用 然而 我可能是错的 是否有最佳实践来完成此任务 实际上 推送通知是可行的方法 在 ios8 及更高版本
  • 如何在没有 baseUrl 的情况下设置 Retrofit

    我的 apiPath 是完全动态的 我有包含 ipAddress 和 SSLprotocol 等字段的项目 基于它们我可以构建我的网址 private String urlBuilder Server server String proto
  • PHP:在 CURL GET 调用中使用 API 密钥

    我看过关于使用 api 密钥在curl 中验证 post 调用的帖子 我有一个 GET 调用 需要 apikey 进行授权 即请求必须具有包含 apiKey 的授权标头 我已经获得了 api 密钥并尝试将其用于 GET 调用
  • 如何在 Codeigniter 中我自己的控制器中生成 API 密钥

    只是想提一下 我确实是 API 开发 概念 结构 最佳实践 方面的新手 我对它一点也不熟悉 所以如果您发现我正在使用 Phil 请原谅我可悲的愚蠢问题Sturgeon 的 REST API 服务器 Curl 库和 REST API 客户端这
  • HTTP 状态 415 - JQUERY 中的 AJAX 调用不支持的媒体类型到使用 JERSEY 实现的 Restful WS

    您好 我正在尝试将 json 数据发布到使用 Jersey 实现的 Restful WS 我通过 jquery ajax 发布数据 为什么我会收到 HTTP Status 415 unsupported Media type 谢谢 单击此处
  • RESTful API,如果查询字符串不够长怎么办?

    我们有产品资源集合 products 我们希望过滤此集合以仅返回具有特定列表之一的成员class id的 例如 GET products classes 100 101 102 这应该返回具有列出的任何类的产品成员的集合 我们遇到的问题是
  • 使用 JWT 创建 PostMan GET 请求

    我是 PostMan 的新手 通常我使用curl 这是获得 JTW 的一个 curl X POST H X Requested With XMLHttpRequest H Content Type application json H Ca
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 使用 AFNetworking 重置基本身份验证凭据

    我正在编写一个 REST 客户端 使用 AFNetworking 并且需要能够在应用程序的单个实例中触发新会话的创建 换句话说 我想 1 通过服务器进行身份验证2 进行一些 REST 调用3 模拟 注销 4 重新与服务器进行身份验证5 进行
  • 将复杂对象传递到 WCF Rest 服务

    我有一个接受复杂对象的操作合约 并且我通过 jQuery 调用该操作 如何使用 jQuery 传递像这样的复杂类型对象 以下是操作签名 public Resolution CreateNewResolution Resolution New
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 如何为 cxf jax-rs 2.0 客户端注册 jackson json 提供程序?

    我有一个 JAX RS 客户端正在发出一个简单的 GET 请求 我使用 CXF 实现和 Spring 进行 DI 呼叫成功 我收到响应代码 200 但是在将响应读入 POJO 时出现错误 例外 2015 05 08 16 11 55 457

随机推荐