【问题标题】:How to use @ResponseBody to return a map<string, string>?如何使用@ResponseBody 返回一个map<string, string>?
【发布时间】:2015-09-23 05:22:41
【问题描述】:
public class RestfulControllerImpl implements RestfulController {

  @Override
  @RequestMapping(value = "maptest", method = RequestMethod.GET)
  @ResponseBody
  public Object mapReturn() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", "test1");
    map.put("sex", "male");
    map.put("address", "1324");
    map.put("old", "123");
    return map;
  }  
}

我想为请求返回一个map&lt;string, string&gt;,它发生了

HTTP-406 不可接受

如何实现该方法以返回带有地图的响应正文并像 json 对象一样显示?

【问题讨论】:

标签: spring spring-mvc


【解决方案1】:

如果您的 Controller 仅返回 json (REST API),则使用 @RestController 而不是 @Controller 注释 Class。然后您不需要为每个端点添加@ResponseBody 注释。由于我们解决了缺少@ResponseBody 的问题,因此下面的代码将满足您的需求。

@GetMapping("/maptest")
public ResponseEntity<?> mapReturn() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", "test1");
    map.put("sex", "male");
    map.put("address", "1324");
    map.put("old", "123");
    return ResponseEntity.ok(map);
}

这里 ResponseEntity 是 Http 响应的包装器。因为我在这里声明为ResponseEntity&lt;?&gt;,所以我可以将任何对象作为 json 返回。 (当您将错误响应作为另一个对象返回时很好)但是如果您确定它只会返回 Map 对象,您可以将其写为ResponseEntity&lt;Map&gt;(如果您有单独的错误处理程序) 希望这很清楚。

【讨论】:

  • 我需要帮助才能在 API 响应中返回 Map。我在从控制器返回 Map 的响应中得到一个 Map
  • @mantri 我可能需要先查看代码。但作为一个建议,你不能从前端将字符串转换为数据类型吗?
  • @GetMapping("/user/getLiveCelebs") public ResponseEntity&lt;Map&lt;Long, Boolean&gt;&gt; getLiveCelebs(HttpServletRequest request) { Map&lt;Long, Boolean&gt; result = quizService.getLiveCelebs(request.getHeader("Authorization")); return ResponseEntity.ok(result); } 当我将调试点放在结果上时,我看到了一个 Long - Boolean 映射。但是在 Swagger/API Response 上,它的字符串与布尔值。长映射键以某种方式转换为字符串。虽然前端可以从 String 中解析 Long,但不应该首先发生。我希望它们以 Long 形式返回。
【解决方案2】:

4XX 是客户端错误 尝试添加请求标头 接受:应用程序/json

【讨论】:

  • 看起来更像是评论而不是答案。
【解决方案3】:
@RequestMapping(value = "maptest", method = RequestMethod.GET)
public ResponseEntity<?> mapReturn() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", "test1");
    map.put("sex", "male");
    map.put("address", "1324");
    map.put("old", "123");
    return new ResponseEntity(map, HttpStatus.OK); // you can change status code based on response
}

您可以设置 ResponseEntity 详细信息,例如正文、状态或标题。

【讨论】:

  • 我需要帮助才能在 API 响应中返回 Map。我在从控制器返回 Map 的响应中得到一个 Map
【解决方案4】:

“HTTP-406 not accepted”主要是处理内容协商,遇到这种问题也可以在浏览器中查看headers,可以使用Jackson或者Gson Dependency来解决

客户端

var jsonData = '{"name":"John", "age":30, "city":"New York"}'
var obj = JSON.parse(jsonData);
$.ajax({
    type : "POST",
    url : "${pageContext.request.contextPath}/getJSON",
    dataType: 'json',
    cache:false,
    async:false,
    data : obj,     
    success: function(data){
        console.log(data.name);
        console.log(data.gender);
        console.log(data.address);

    
    }
});

服务器端:

@RequestMapping(value="/getJSON")
@ResponseBody
public  String  mapReturnUsingJackson() throws JsonGenerationException, JsonMappingException, IOException   {

    Map<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("name", "County");
    hashMap.put("address", "Unknown");
    hashMap.put("gender", "male");
    String jsonJackson=new ObjectMapper().writeValueAsString(hashMap);
    return jsonJackson;
   }

   //OR

   @RequestMapping(value="/getJSON")
   @ResponseBody
   public  String  mapReturnUsingGSON() {

    Map<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("name", "County");
    hashMap.put("address", "Unknown");
    hashMap.put("gender", "male");
    String jsonStr = new Gson().toJson(hashMap);
  
    return jsonStr;
   }

【讨论】:

    【解决方案5】:

    返回地图而不是对象。

     @RequestMapping(value = "maptest", method = RequestMethod.GET)
            @ResponseBody
            public Map<String,String> mapReturn() {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("name", "test1");
                map.put("sex", "male");
                map.put("address", "1324");
                map.put("old", "123");
                return map;
            } 
    

    【讨论】:

    • 不起作用 - "message": "java.util.HashMap cannot be cast to org.springframework.http.ResponseEntity"
    【解决方案6】:

    尝试将函数的返回类型更改为Map&lt;String, String&gt;,并将“produces”添加到请求映射中:

    @RequestMapping(path="maptest", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Map<String, String> test() {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        return map;
    }
    

    【讨论】:

    • 不起作用:java.util.HashMap cannot be cast to org.springframework.http.ResponseEntity
    • 我在发布回复之前对其进行了测试。在 @RestController 中使用 Spring Boot 2.0.1.RELEASE
    • 我假设您使用的是 Jackson?这可能与杰克逊可以在类路径上找到的转换器有关。你可能有我没有的 pom 依赖项
    • 是的,可能就是你所说的。我有用于 JIRA oauth 的 jackson-core、jackson-databind 和 google-http-client-jackson2
    【解决方案7】:

    @ResponseBody 用于返回字符串/json。你可能想使用模型,看看这个

    http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/ui/Model.html

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 2016-11-26
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多