描述
在此记录一下使用RestTemplate过程中所踩到的一个坑(参数映射中的传值问题)。
示例
**错误示例:**Map<Object,Object>
@Configuration
public class RestTemplateUtil{
@Autowired
RestTemplate getRestTemplate
public final static String NULL_ERROR_MSG = "该参数值不能为空,请检查参数值";
/**
* 常规POST
* @param url 请求地址
* @return JSONObject
*/
public Object postResource(String url, Map<Object, Object> params) {
Assert.notEmpty(params, NULL_ERROR_MSG);
return Objects.requireNonNull(getRestTemplate.postForObject(url, null, String.class, params));
}
}
@SpringBootTest
public class Test{
String urlRes7 = "http://127.0.0.1:18080/demo/getUser/id/{id}/name/{name}";
@Test
void contextLoads() {
Map<Object, Object> map = new HashMap<>();
map.put("id", "456");
map.put("ni", "1234");
System.out.println(resttemplaterestTemplateUtil.postResource(urlRes7, map));
}
}
报错代码:Not enough variable values available to expand ‘xxx‘,遇见这个错的时候,如果你要不仔细观察的话,
那么这个错误会让你摸不到头绪,就会让自己陷入这个问题对应的解决办法中:“值没有映射上,只需要映射上值即可”,
这个观点,但实际的问题却是参数类型的原因,所以当遇到问题的时候一定要仔细观察,
观察一下执行流程,这样的话,你会很快定位到问题所在。
正确示例:Map<String,Object>
@Configuration
public class RestTemplateUtil{
@Autowired
RestTemplate getRestTemplate
public final static String NULL_ERROR_MSG = "该参数值不能为空,请检查参数值";
/**
* 常规POST
* @param url 请求地址
* @return JSONObject
*/
public Object postResource(String url, Map<String, Object> params) {
Assert.notEmpty(params, NULL_ERROR_MSG);
return Objects.requireNonNull(getRestTemplate.postForObject(url, null, String.class, params));
}
}
@SpringBootTest
public class Test{
String urlRes7 = "http://127.0.0.1:18080/demo/getUser/id/{id}/name/{name}";
@Test
void contextLoads() {
Map<String, Object> map = new HashMap<>();
map.put("id", "456");
map.put("ni", "1234");
System.out.println(resttemplaterestTemplateUtil.postResource(urlRes7, map));
}
}
分析
RestTemplate的方法参数对象是Map<String,Object>类型,不支持Map<Object,Object>类型,如果使用Map<Object,Object>类型的话,虽然不会报错,但是会一直提示Not enough variable values available to expand ‘xxx‘错误,即使你调试到底层查看,也无法快速定位到问题,所以严格按照方法的指定类型是很重要的。