【问题标题】:How to use Spring`s RestTemplate to POST an array of strings如何使用 Spring 的 RestTemplate 发布字符串数组
【发布时间】:2014-12-25 01:35:58
【问题描述】:

我正在尝试使用 spring 的 restTemplate 发布一个简单的字符串数组。有人成功了吗?

客户:

    public void save(){
        String company = "12345";
        String productId = "10";
        String[] colors = {"A","B","C","D","E"};
        String convertUrl = "http://localhost:8080/cool-web/save";
        MultiValueMap<String, Object> convertVars = new LinkedMultiValueMap<String, Object>();
        convertVars.add("companyID", StringUtils.trimToEmpty(company));
        convertVars.add("productId", StringUtils.trimToEmpty(productId));
        convertVars.add("disclaimer", StringUtils.trimToEmpty("ffs"));
        convertVars.add("colorsArray", colors); 
        restTemplate.postForObject(convertUrl, null, String.class, convertVars);
}

服务是:

    @RequestMapping(value = "/save", method = RequestMethod.POST)
    @ResponseStatus(value = HttpStatus.OK)
    public void save(@RequestParam("colorsArray[]") String[] colors,
        @RequestParam("disclaimer") String disclaimer,
        @RequestParam("companyID") String companyID,
        @RequestParam("productId") String productId) {

    resourceService.save(colors, disclaimer, companyID, productId);
}

我收到了 400 错误请求。

我做错了什么?

我正在使用默认的 messageConverters。

我需要为一个简单的字符串数组实现自定义 messageConverter 吗?

【问题讨论】:

    标签: java arrays spring post resttemplate


    【解决方案1】:

    解决办法如下:

    public void save(){
    
        String company = "12345";
        String productId = "10";
        String[] colors = {"A","B","C","D","E"};
        String convertUrl = "http://localhost:8080/cool-web/save";
    
        MultiValueMap<String, Object> convertVars = new LinkedMultiValueMap<String, Object>();
    
        convertVars.add("companyID", StringUtils.trimToEmpty(company));
        convertVars.add("productId", StringUtils.trimToEmpty(productId));
        convertVars.add("disclaimer", StringUtils.trimToEmpty("ffs"));
    
        for(String color:colors){
            convertVars.add("colorsArray[]", color); 
        }
    
        restTemplate.postForObject(convertUrl, convertVars , String.class); 
    }
    

    【讨论】:

      【解决方案2】:

      如果您尝试 POST MultiValueMap,请在代码中使用 Map.class 而不是 String.class

      restTemplate.postForObject(convertUrl, null, Map.class, convertVars);
      

      我猜你的服务方法是错误的。因为您正在发布MultiValueMap 并且在save 方法中,您试图将所有内部变量作为方法参数,即RequestParam。 那不会发生。您只需要在那里接受MultiValueMap 并从中取出东西以供使用。

      public void save(@RequestParam("colorsArray[]") MultiValueMap<String, Object> convertVars ) {
          resourceService.save(convertVars.getColors(), .... );
      }  
      

      【讨论】:

      • String.class 是响应类型,所以它不应该是 Map.class。该映射用于构建请求的主体,因此服务不应作为参数接收映射。不过我试过你的建议还是不行。
      【解决方案3】:

      @RequestParam(value) value - “要绑定的请求参数的名称。”所以@RequestParam("colorsArray[]") String[] colors 试图找到名称为“colorsArray[]”的参数,但你输入了名称为“colorsArray”的参数。可能是这个原因。

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 2012-12-18
        • 2016-11-17
        • 2017-02-01
        • 2016-02-09
        • 2020-11-29
        • 1970-01-01
        相关资源
        最近更新 更多