目录

  • 描述
  • 示例
  • 分析

描述

   在此记录一下使用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‘错误,即使你调试到底层查看,也无法快速定位到问题,所以严格按照方法的指定类型是很重要的。

更多推荐

分析Not enough variable values available to expand ‘xxx‘