2013-12-09 2 views
2

У меня есть метод в Spring rest service.Spring RestRemplate postforobject с параметром запроса с целым значением

@RequestMapping(value = "test/process", method = RequestMethod.POST) 
public @ResponseBody MyResponse processRequest(String RequestId, int count) 

Я использую Spring RestTemplate для вызова этой службы.

RestTemplate restTemplate = this.getRestTemplate(); 
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); 
map.add("RequestId", RequestId); 
map.add("count", count); 
restTemplate.postForObject(url, map,MyResponse.class); 

Когда я пытаюсь вызвать метод клиента я получаю исключение, нет подходящего HttpMessageConverter не найдено для типа запроса [java.lang.Integer]

org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [java.lang.Integer] 
at org.springframework.http.converter.FormHttpMessageConverter.writePart(FormHttpMessageConverter.java:310) 
at org.springframework.http.converter.FormHttpMessageConverter.writeParts(FormHttpMessageConverter.java:270) 
at org.springframework.http.converter.FormHttpMessageConverter.writeMultipart(FormHttpMessageConverter.java:260) 
at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:200) 
at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:1) 
at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:596) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:444) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409) 
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:287) 

Я знаю, что один из способов является передать все параметры как String. Но мне может понадобиться передать сложные типы данных в качестве параметров позже. Каковы способы достижения этого. У меня есть googled, и какой-то вариант, похоже, пишет мои собственные конвертеры. Как я должен начать решение этой проблемы.

+0

В следующей строке: map.add ("RequestId", RequestId); RequestId объект более сложный, чем строка? Можем ли мы увидеть URL-адрес? Спасибо! – java1337

+0

@ java1337 RequestId в настоящее время является просто строкой, но мне может потребоваться опубликовать пользовательские типы данных или объект даты другими способами. – d123

ответ

6

Основной причиной этой ошибки является то, что, указав Integer в LinkedMultiValueMap, RestTemplate будет считать, что ваш запрос является многопользовательским запросом. Нет HttpMessageConverter, зарегистрированного по умолчанию, который может обрабатывать значения записи типа Integer в теле запроса.

Как вы сказали, вы можете справиться с этой ситуацией, изменив count на String. В конце концов, нет параметров Integer в параметрах HTTP-запроса. Однако вы были обеспокоены

Но мне, возможно, придется передавать сложные типы данных в качестве параметров позже.

Предположим, что-то вроде этого

public @ResponseBody MyResponse processRequest(String RequestId, int count, Complex complex) { 

с

public class Complex { 
    private String someValue; 
    private int intValue; 

    public String getSomeValue() { 
     return someValue; 
    } 

    public void setSomeValue(String someValue) { 
     this.someValue = someValue; 
    } 

    public int getIntValue() { 
     return intValue; 
    } 

    public void setIntValue(int intValue) { 
     this.intValue = intValue; 
    } 

    public String toString() { 
     return someValue + " " + intValue; 
    } 
} 

следующее будет работать нормально

MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); 
map.add("RequestId", "asd"); 
map.add("count", "42"); 
map.add("someValue", "complex"); 
map.add("intValue", "69"); 
restTemplate.postForObject(url, map,MyResponse.class); 

Помните, что параметры запроса используются для заполнения поля атрибутов модели по их имени s.

Еще лучше, если бы вы использовали стандарт сериализации, такой как JSON или XML.

+0

Спасибо за ответ. «Используя стандарт сериализации, такой как JSON или XML.», Вы имеете в виду, что я должен создать объект запроса с RequestId, count и someValue в качестве memebers. и опубликовать этот объект. контроллер должен иметь параметры как RequestBody MyClass myobject? – d123

+0

@aks Нет, я имею в виду вместо отправки параметров запроса, вы должны отправить JSON и XML. Spring поддерживает эти типы с аннотацией '@ RequestBody' по параметрам метода обработчика. –