Spring RestTemplate - 在GET中传入对象参数

时间:2016-07-07 03:42:01

标签: java spring spring-boot get resttemplate

如何使用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未正确设置为参数。我该怎么做呢?

提前致谢。

3 个答案:

答案 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() @RequestBodyRequestMethod.POSTrestTemplate.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)