当前位置: 首页 > 知识库问答 >
问题:

未找到响应类型-自定义RestTemplate的合适HttpMessageConverter

程项禹
2023-03-14

首先,抱歉可能重复。我发现了一些关于类似问题的问题。然而,我仍然想不出我的具体情况出了什么问题。

所以,例如json从服务器:

[
  {
    "_id": "55f9690f30ef6f210e2dc3a5",
    "ID": "74c4bf82-9f78-4df5-b9d7-6547e2a55eaa",
    "Name": "myLand, Saarbrücken",
    "__v": 0,
    "Shops": [
      {
        "ID": "b8eacee1-b2c6-48aa-ac6f-2e7fbe3a5d68",
        "Name": "ARA",
        "_id": "55f9690f30ef6f210e2dc3a6",
        "News": [
          {
            "ID": "d79b7f51-7d5c-4bd6-9321-e40c6e93788c",
            "ValidFrom": "2015-01-08T00:00:00",
            "ValidTo": "2015-09-30T00:00:00",
            "_id": "55f9690f30ef6f210e2dc3a7",
            "Texts": [
              {
                "ID": "TITLE",
                "Value": "11. Wochenspiegel Firmenlauf",
                "_id": "55f9690f30ef6f210e2dc3a9"
              },
              {
                "ID": "BODY",
                "Value": "Wir gratulieren zur ersten und gleich sehr erfolgreichen Teilnahme am 11.Wochenspiegel Firmenlauf in Dillingen,\r\nunsere Teams vom “Outlet center Wadgassen“ haben ihren Lauf mit tollen Zeiten abgeschlossen und hatten trotz\r\nhohen Temperaturen einen wunderbaren Tag – wie man sehen kann. Wir freuen uns schon jetzt auf nächstes Jahr!",
                "_id": "55f9690f30ef6f210e2dc3a8"
              }
            ]
          }
        ],
        "Texts": [
          {
            "ID": "DESCRIPTION",
            "Value": "Mit Tradition in die Zukunft Seit sechs Jahrzehnten steht ara für vielfältige Schuhmode erstklassiger Qualität,",
            "_id": "55f9690f30ef6f210e2dc3aa"
          }
        ]
      }
    ]
  }
]

我生成了名为Mall的类(以及数据结构其余部分的所有子类):

public class Mall
{

    private String Id;
    private String ID;
    private String Name;
    private int V;
    private List<Shop> Shops = new ArrayList<Shop>();
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     * @return The Id
     */
    public String getId()
    {
        return Id;
    }

    /**
     * @param Id The _id
     */
    public void setId(String Id)
    {
        this.Id = Id;
    }

    /**
     * @return The ID
     */
    public String getID()
    {
        return ID;
    }

    /**
     * @param ID The ID
     */
    public void setID(String ID)
    {
        this.ID = ID;
    }

    /**
     * @return The Name
     */
    public String getName()
    {
        return Name;
    }

    /**
     * @param Name The Name
     */
    public void setName(String Name)
    {
        this.Name = Name;
    }

    /**
     * @return The V
     */
    public int getV()
    {
        return V;
    }

    /**
     * @param V The __v
     */
    public void setV(int V)
    {
        this.V = V;
    }

    /**
     * @return The Shops
     */
    public List<Shop> getShops()
    {
        return Shops;
    }

    /**
     * @param Shops The Shops
     */
    public void setShops(List<Shop> Shops)
    {
        this.Shops = Shops;
    }

    public Map<String, Object> getAdditionalProperties()
    {
        return this.additionalProperties;
    }

    public void setAdditionalProperty(String name, Object value)
    {
        this.additionalProperties.put(name, value);
    }

}

服务器返回内容类型text/plain。为了修改内容类型,我编写了简单的扩展类:

public class RestTemplateJSON extends RestTemplate
{

    @Override
    protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
                              ResponseExtractor<T> responseExtractor) throws RestClientException
    {

        //logger.info(RestTemplateJSON.class.getSuperclass().getSimpleName() + ".doExecute() is overridden");

        Assert.notNull(url, "'url' must not be null");
        Assert.notNull(method, "'method' must not be null");
        ClientHttpResponse response = null;
        try
        {
            ClientHttpRequest request = createRequest(url, method);
            if (requestCallback != null)
            {
                requestCallback.doWithRequest(request);
            }
            response = request.execute();

            // Set ContentType to JSON
            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);

            if (!getErrorHandler().hasError(response))
            {
                logResponseStatus(method, url, response);
            } else
            {
                handleResponseError(method, url, response);
            }
            if (responseExtractor != null)
            {
                return responseExtractor.extractData(response);
            } else
            {
                return null;
            }
        }
        catch (IOException ex)
        {
            throw new ResourceAccessException("I/O error on " + method.name() +
                    " request for \"" + url + "\":" + ex.getMessage(), ex);
        }
        finally
        {
            if (response != null)
            {
                response.close();
            }
        }

    }

    private void logResponseStatus(HttpMethod method, URI url, ClientHttpResponse response)
    {
        //if (logger.isDebugEnabled())
        {
            try
            {
                System.out.println(method.name() + " request for \"" + url + "\" resulted in " +
                        response.getRawStatusCode() + " (" + response.getStatusText() + ")");
            }
            catch (IOException e)
            {
                // ignore
            }
        }
    }

    private void handleResponseError(HttpMethod method, URI url, ClientHttpResponse response) throws IOException
    {
        getErrorHandler().handleError(response);
    }
}

最后,这是我试图使用我的网络服务的方式:

RestTemplateJSON restTemplate = new RestTemplateJSON();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Mall mall = restTemplate.getForObject(url, Mall.class);

然而,我仍然得到同样的例外:

无法提取响应:未找到响应类型[m.m.restspringtest.Mall.Mall]和内容类型[application/json]的合适HttpMessageConverter

据我所知,如果我改变内容类型,应该可以。你能告诉我我做错了什么吗?

共有1个答案

巫马心水
2023-03-14

所以,我终于想通了。json中有数组,所以我想把它映射到购物中心[],而不是购物中心。我提供错了类,应该有:

RestTemplateJSON restTemplate = new RestTemplateJSON();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Mall[] malls = restTemplate.getForObject(url, Mall[].class);
 类似资料:
  • 我是新的Spring集成和工作在Spring集成超文本传输协议模块为我的项目要求。我从出站网关作为超文本传输协议客户端发送请求。我试图向服务器发起一个请求,服务器应该用我的设置值返回消息负载。我正在将对象转换为JSON,用于发送到服务器我正在从客户端(HttpClientDemo)向服务器端的入站网关发送请求。为此,我将我的对象转换成JSON,然后将JSON字符串转换为客户端的对象,在那里执行一些

  • 问题内容: 使用spring,使用以下代码: 我懂了 pojo的片段: 问题答案: 从Spring的角度来看,没有一个通过注册的实例可以将内容转换为对象。感兴趣的方法是。上述所有回报的实现,包括。 由于没有人可以读取您的HTTP响应,因此处理失败,并出现异常。 如果你能控制服务器响应,修改设置到,或东西匹配。 如果您不控制服务器响应,则需要编写和注册自己的(可以扩展Spring类,see 及其子类

  • org.springframework.web.client.未知内容类型异常:无法提取响应:没有找到适合响应类型[类net.minidev.json.JSONObject]和内容类型[应用程序/json]的HttpMessageConzer endpoint Url还返回JSONObject,因此不知道为什么不匹配

  • 我在使用SpringREST模板时遇到以下错误,但我已经为json响应定义了jackson。 当我使用rest客户端查询url时,我也得到了良好的响应。 rest模板配置:

  • 使用Spring,使用以下代码: 我得到 pojo的一个片段:

  • 我正在尝试使用spring for Android从REST服务中检索一些数据。但是我遇到了问题。我也在使用Robospice——因此有一种类似这样的方法: 不幸的是,这不起作用。我将引发以下异常: 现在,基于我的谷歌搜索,我觉得我需要添加一个消息转换器。我只是不确定我需要哪个消息转换器,或者在哪里添加它?