如何使用RestTemplate将对象作为参数传入?例如,假设我使用Spring Boot设置了以下服务:
@RequestMapping(value = "/get1", method = RequestMethod.GET)
public ResponseEntity<String> get1(@RequestParam(value = "parm") String parm) {
String response = "You entered " + parm;
return new ResponseEntity<String>(response, HttpStatus.OK);
}
@RequestMapping(value = "/get2", method = RequestMethod.GET)
public ResponseEntity<String> get2(@RequestParam(value = "parm") MyObj parm) {
String response = "You entered " + parm.getValue();
return new ResponseEntity<String>(response, HttpStatus.OK);
}
如果客户想要拨打第一个服务,他们可以使用以下内容:
//This works fine
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:8080/get1?parm={parm}", String.class, "Test input 1");
但是如果客户想要拨打第二个服务,他们会使用以下内容获得500错误:
//This doesn't work
MyObj myObj = new MyObj("Test input 2");
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:8080/get2?parm={parm}", String.class, myObj);
MyObj类看起来像这样:
@JsonSerialize
public class MyObj {
private String inputValue;
public MyObj() {
}
public MyObj(String inputValue) {
this.inputValue = inputValue;
}
public String getInputValue() {
return inputValue;
}
public void setInputValue(String inputValue) {
this.inputValue = inputValue;
}
}
我假设问题是myObj未正确设置为参数。我该怎么做呢?
提前致谢。
答案 0 :(得分:3)
当您使用复杂对象(如MyObj
)作为@RequestParam
时,Spring会尝试将字符串转换为该复杂对象。在这种情况下,由于MyObj
只有一个名为String
的{{1}}字段,因此它会自动使用您提供给查询参数的任何值来填充对象中的属性。
例如,如果您致电:inputValue
,您将获得http://localhost:8080/get2?parm=foobar
,其中MyObj
将为inputValue
。
如果您使用"foobar"
,则不会出现错误,但是它将尝试使用RestTemplate
方法将new MyObj("Test input 2")
转换为字符串,并且响应将为:
您输入了com.example.MyObj@63a815e8
这可能不是你想要的。通常,您不希望将复杂对象作为请求参数传递,您可以使用toString()
@RequestBody
和RequestMethod.POST
将restTemplate.postForEntity()
正确传递为JSON。
按照以下方式更改您的控制器:
MyObj
并使用@RequestMapping(value = "/get2", method = RequestMethod.POST)
public ResponseEntity<String> get2(@RequestBody MyObj parm) {
String response = "You entered " + parm.getInputValue();
return new ResponseEntity<>(response, HttpStatus.OK);
}
这样称呼它:
RestTemplate
这会将您的对象正确传递为JSON。
答案 1 :(得分:0)
您必须在responseType
之后传递每个URI参数的值。问题是RestTemplate
不知道如何将对象映射到URI参数。您必须显式调用适当的myObj
方法来检索实际值:
String response = restTemplate.getForObject(
"http://localhost:8080/get2?parm={parm}", String.class,
myObj.getInputValue());
您呼叫的getForObject
方法的签名是:
public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws ….
其中urlVariables
是URI变量值的数组,用于扩展URI。
答案 2 :(得分:-1)
String response = restTemplate.getForObject("http://localhost:8080/get2?parm={parm}", String.class, myObj)
应该改为
String response = restTemplate.getForObject("http://localhost:8080/get2?parm={parm}", MyObj.class, myObj)