如何使用Spring RestTemplate表示为JSON的查询参数?

我需要使用Spring RestTemplate向具有表示为JSON的查询参数的HTTP端点发出请求。

restTemplate.getForObject( apiRoot + "/path" + "?object={myObject}", Response.class, new MyObject()) 

在这里,我需要将MyObject转换为JSON(显然是URL编码)。 但RestTemplate只是将其转换为带有toString调用的StringMyObject可由Jackson转换为JSON。 UriComponentsBuilder行为方式相同:

 UriComponentsBuilder.fromHttpUrl(apiRoot) .path("/path") .queryParam("object", new MyObject())) .queryParam("access_token", accessToken) .toUri() 

有没有办法避免手工调用ObjectMapper.writeValueAsString

更新:澄清一下,在结果中我需要在我的URI中使用?object={"key":42} (或者在URL编码forms?object=%7B%22key%22%3A42%7D ),因为MyObject有一个属性key ,值等于42

使用writeValueAsString什么问题? 你可以解释吗?

我想到的唯一解决方案就是(我不认为jackson是否有办法知道这个对象应该在那一刻被序列化):

 @Autowired ObjectMapper objectMapper; @Override public void run(String... strings) throws Exception { String urlBase = "http://localhost:8080/path"; RestTemplate restTemplate = new RestTemplate(); String url; MultiValueMap params = new LinkedMultiValueMap(); params.set("object", objectMapper.writeValueAsString(new MyObject())); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(urlBase).queryParams(params); url = builder.build().toUri().toString(); LOGGER.info("Composed before decode: " + url); //restTemplate.getForObject(url, Void.class); url = URLDecoder.decode(url, "UTF-8"); LOGGER.info("Composed after decode: " + url); } 

输出:

 2016-04-05 16:06:46.811 INFO 6728 --- [main] com.patrykwoj.StackOverfloApplication : Composed before decode: http://localhost:8080/path?object=%7B%22key%22:43%7D 2016-04-05 16:06:46.941 INFO 6728 --- [main] com.patrykwoj.StackOverfloApplication : Composed after decode: http://localhost:8080/path?object={"key":43} 

编辑:

我忘了提到,将JSON对象作为请求参数发送通常不是一个好主意。 例如,您可能会遇到JSON中的大括号问题。