Spring RestTemplate 中未找到 HttpMessageConverter

2024-01-12

当我使用 Spring RestTemplate 检索 JSON 时出现错误。错误说

Could not extract response: no suitable HttpMessageConverter found for response type  [class au.org.jeenee.mdm.models.PhoneResponse] and content type [application/json]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:492)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:447)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:295)
    at au.org.jeenee.mdm.services.EccClientServiceImpl.findPhoneByImei(EccClientServiceImpl.java:51)
    at au.org.jeenee.mdm.controllers.DeviceController.showEditForm(DeviceController.java:308)

我发现该消息意味着没有注册 JSON 转换器,但我的设备中有 Jackson 消息转换器xml.

应用程序上下文.xml

<bean id="jacksonMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jacksonMessageConverter" />
        </list>
    </property>
</bean>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
  <constructor-arg>
      <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
           <constructor-arg ref="httpClient"/>
       </bean>
   </constructor-arg>
   <property name="messageConverters">
        <list>
            <ref bean="jacksonMessageConverter" />
        </list>
    </property>
</bean>

这是我使用 RestTemplate 的代码。

public class MyRestClientService {
@Override
    public List<DeviceHolder> findDeviceHoldersByUserId(String userId) {
        String uri = "/web/getpersonlist?userId=" + userId;
        try {
            DeviceHolderResponse response = restClient.getRestTemplate().postForObject(restClient.createUrl(uri), "", DeviceHolderResponse.class);


            if (response!=null && response.isOk() && response.getResult()!=null){

                DeviceHolder[] deviceHolders = response.getResult();
                return Arrays.asList(deviceHolders);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return Collections.emptyList();
    }

    @Override
    public Phone findPhoneByImei(String imei) {
        log.info("findPhoneByImei:" + imei);

        Phone phone = null;
        String uri = "/ecc/getphoneplan?imei=" + imei;
        try {
            PhoneResponse response = restClient.getRestTemplate().postForObject(restClient.createUrl(uri), "", PhoneResponse.class);
            if (response.getResult()!=null)
                phone = response.getResult();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return phone;
    }
}

PhoneResponse.java
public class Phone implement Serializable {
   private boolean ok;
   private String message;
   private Phone result;

  //getters and setters
}


Phone.java
public class Phone implements Serializable {

    @JsonProperty(value="phoneid")
    private long phoneId;

    private Plan plan;
    private String sim;
    private String imei;

    @JsonProperty(value="phonetype")
    private String phoneType;

    @JsonProperty(value="phonenumber")
    private String phoneNumber;
    private String label;
    @JsonProperty(value="connecteddate")
    private String connectedDate;

//getters and setters
}

Plan.java
public class Plan implements Serializable {

    @JsonProperty(value="planid")
    private long planId;

    @JsonProperty(value="planname")
    private String planName;

    private double billingIncrement;

    private double owiStdUnitCost;

    private double owiFlagFall;

    private double stdCap;

    private double dataCap;

    private double smsCap;

    private double owiDataUnitCost;

    private double owiSms;

    //getters and setters
}

响应数据包如下:

{
   "ok": true,
   "message": "",
   "result":
   {
       "phoneid": 600003,
       "phonenumber": 478439503,
       "phonetype": "Samsung Galaxy S2",
       "imei": "1111111111",
       "sim": "1111111111",
       "label": "Person name",
       "connecteddate": "2012-09-19 00:00:00.0",
       "plan":
       {
           "planid": 34,
           "planname": "$59 Plan",
           "billingIncrement": 30,
           "owiStdUnitCost": 81.8181818181818,
           "owiFlagFall": 0,
           "stdCap": 636.3636,
           "dataCap": 227.2665,
           "smsCap": 1363.638,
           "owiDataUnitCost": 0.022194,
           "owiSms": 22.7272727272727
       }
   }
}

奇怪的是,我调用的时候没有报错findDeviceHoldersByUserId方法但错误为findPhoneByImei方法。直到之前,这一直在起作用。

我一次又一次地尝试,但仍然有错误。请帮助解决问题。

Thanks.


我发现可能导致此问题的几个原因是 -

  1. setter/getter 的数据类型与实际属性的数据类型不同(sunghun 的评论中也提到)
  2. 如果存在看起来像字段的 setter/getter 的重载方法 - 与 setField 或 getField 名称相同,其中 field 是类的属性。

我曾有一片田野private boolean success和 2 个 setter 方法 -

public void setSuccess(List<Object> dataList);
public void setSuccess(boolean success);

在调试时,我发现该类com.fasterxml.jackson.databind.deser.BeanDeserializerFactory抛出异常。这个异常在 Jackson 的 lib 中被抑制,并且 RestTemplate 抛出的异常与主题相同。

java.lang.IllegalArgumentException: Conflicting setter definitions for property "failure": com.test.dto.JsonResponse#setFailure(1 params) vs com.test.dto.JsonResponse#setFailure(1 params)

我将方法更改为public void setSuccessData(List<Object> dataList);效果很好。

希望这对某人有帮助。

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

Spring RestTemplate 中未找到 HttpMessageConverter 的相关文章

随机推荐

  • 将标签放置在分档/步进颜色条指南中分档的中间?

    推理 我想轻松使用现成的连续刻度 来自任何提供的包 scale continuous等 对于类似序数因子的数据 例如mtcars cyl 因为这些数据只包含几种离散值 所以我想直接标记图例键 而不是容器限制 怎么做 library ggpl
  • 如何在写入 CSV 文件时附加到新行[重复]

    这个问题在这里已经有答案了 我想在写入时附加到 CSV 文件中的新行 当前的 CSV 文件如下所示 a b c 1 1 1 我的附加到 CSV 文件的代码 with open mycsvfile csv a as f writer csv
  • 如何实现更高效的搜索功能?

    在我的数据库中有 3 列 分别是姓名 年龄 性别 在程序中 我只想使用 1 个搜索按钮 单击该按钮时 程序会确定哪 3 个文本框已输入并搜索正确的数据 您如何处理查询 例如 如果姓名和性别有文本 则查询 Select from table
  • Java 中的类型转换和自动类型提升

    让我们考虑一下 Java 中的一些简单表达式 byte var 0 var byte var 1 这里 在上面的语句中 显然由于自动类型提升而需要类型转换 表达式的评估 var 1 自动提升为 int 因此 必须显式转换为 byte 以将其
  • 在运行时更改时,表单验证会忽略语言

    我正在使用 CodeIgniter 构建多语言 Web 应用程序 我有英语和其他语言 system languages 文件夹 我创建了一个负责在运行时更改工作语言的模型 默认情况下 CodeIgniter 以法语工作 如中定义 appli
  • 将 S3 上传/浏览与 django-tinymce 集成

    我一直在寻找有关如何将 Amazon S3 与 TinyMCE 集成的资源 到目前为止我想到的最好的链接是 http forums aurigma com yaf postst4033 Amazon S3 File Manager for
  • Bootstrap 下拉菜单 - 不适用于子页面

    我正在使用引导程序并创建了一个下拉菜单 主要项目是一个在主页上有效但在子页面上无效的链接 这是我的代码 li a href preview design centre class dropdown toggle scroll Design
  • 如何使用Rete算法

    如何在java中使用Rete算法 我需要编写自己的算法实现吗 或者是否有已经实现的库可用 所以这是一个相当老的问题 但如果你在谷歌上搜索 Rete 实现 那么排名很高 所以我会在这里留下一些信息 维基百科条目 http en wikiped
  • 主干路由器侦听器未命中哈希标签

    我的问题是 当我在链接中使用哈希标签时 它只是将哈希附加到 url 而不是转到路由 例如 ToDo public offline2 html test 如果我离开tag 由于某种原因它确实会转到路由器 我已经用以下代码关闭了 jquery
  • 本地通知未根据时区进行调整

    我正在安排一个带有 NSDate 的本地通知 时间设置为晚上 9 点 并将通知的时区设置为 UTC GMT 如果我将设备时区设置为 UTC 时间设置为晚上 8 59 则通知将按预期在晚上 9 点触发 但是 如果我将设备时区设置为美国西海岸
  • Clojure 交换!原子出队

    有没有更简单的方法在 Clojure 中编写此代码 def queue atom top nil queue PersistentQueue EMPTY swap queue hash map top nil queue conj queu
  • 如何阻止来自中国的请求?

    我有一个比较流行的 API 每天 10 000 多个请求 每天从某个 IP 地址发出 10 个请求后 我会返回一条消息 告诉用户如果想更多地使用该服务 则需要支付一些现金 今天早上 我发现我的网络服务运行速度非常慢 我检查了数据库 发现我收
  • PHP 中值对象的示例是什么?

    我读过很多值对象的 C 示例 并且我知道它是一个由其值标识的 对象 如果值发生变化 则该对象是 新的 然而 当涉及到 PHP 时 这似乎没有意义 要么是这样 要么我只是没有建立联系 值对象只是一个字符串吗 为了将这一点放在上下文中 在许多面
  • Java 8 中限制 groupBy

    如何按每个条目限制 groupBy 例如 基于这个例子 流分组依据 http www leveluplunch com java examples java util stream groupingBy example studentCla
  • 禁用 awt/swing 调试(精细)日志消息

    我正在使用 java 日志记录将应用程序的日志消息写入日志文件和其他目的地 将日志级别设置为FINE 我还从 AWT Swing 收到 不需要的 消息 例如 0 when grabbed 1 contains 2 和别的 查看 JDK 源代
  • Android - 如何隐藏/显示进度条onclick

    我试图在单击按钮时显示进度条 当我测试应用程序时 它强制关闭 停止 在添加进度条代码之前 我的应用程序运行良好 如果这很重要的话 我也使用切换按钮 并且我想要旋转的进度条而不是对话框 有什么帮助吗 这是我的代码 Override publi
  • CoffeeScript 类的范围

    我想在类属性中嵌套多个函数 如下所示 不幸的是 他们无法访问该类的主要范围 我可以在不传递每个嵌套函数引用的情况下解决这个问题吗this class myClass constructor gt errors doSomething gt
  • 使用 extjs4 重用自定义组件

    我在 JavaScript 文件中创建了一个自定义网格 我想将它用作单独 js 文件中不同面板的 xtype 如果我在单个面板上使用它 它工作得很好 但是当我尝试同时在不同的面板上使用它时 我在 chrome 开发人员工具控制台中收到错误消
  • UDID 或 IMEI——哪个更好?

    在开发需要我唯一识别电话用户的应用程序时 我希望得到一些关于最好使用手机的 UDID 还是 IMEI 的建议 使用两者有什么优点 缺点吗 所有评论将不胜感激 ANDROID ID 的优点 设置 安全 ANDROID ID 这是设备首次启动时
  • Spring RestTemplate 中未找到 HttpMessageConverter

    当我使用 Spring RestTemplate 检索 JSON 时出现错误 错误说 Could not extract response no suitable HttpMessageConverter found for respons