在Spring restTemplate中找不到HttpMessageConverter [英] HttpMessageConverter not found in Spring restTemplate

查看:520
本文介绍了在Spring restTemplate中找不到HttpMessageConverter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用String restTempate检索JSON时出现错误.错误说

I have got error when I retrieve JSON using String restTempate. Error says

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转换器,但是我的xml中有Jackson消息转换器.

I found out the message means there is no JSON converter registered but I have Jackson message converter in my xml.

applicationContext.xml

applicationContext.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的代码.

And here is my code to use 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方法却有错误.直到最近,它一直在起作用.

Strangely, there is no error when I call findDeviceHoldersByUserId method but error for findPhoneByImei method. And this has been working up to just before.

我一次又一次尝试,但仍然出现错误.请帮助解决问题.

I tried again and again but I still have the error. Please help to fix the problem.

谢谢.

推荐答案

我发现,可能导致此问题的原因有-

Couple of reasons, I found, that can cause this issue are -

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

我有一个字段private boolean success和2个设置方法-

I had a field private boolean success and 2 setter methods -

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

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

On debugging, I found that class com.fasterxml.jackson.databind.deser.BeanDeserializerFactory was throwing an exception. This exception was suppressed within Jackson's lib and the exception thrown by the RestTemplate was the same as the subject.

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);,并且效果很好.

I changed the method to public void setSuccessData(List<Object> dataList); and it worked fine.

希望这对某人有帮助.

这篇关于在Spring restTemplate中找不到HttpMessageConverter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆