是否有可能在春季休息服务中使用@RequestParam for JSON?

时间:2016-10-18 22:34:55

标签: json spring rest spring-mvc spring-boot

我使用Spring启动,我在Spring编写rest服务器 我有很多不同的请求映射,我需要接受json中的内容

我可以使用@RequestBody注释做到这一点 但在这种情况下,我会为每个请求和每个可能的响应提供大量的POJO类。

我需要发送和接收的很多JSON非常简单 - 一个或两个或三个值

是否可以使用@RequestParam("field1_from_my_json")@RequestParam("field2_from_my_json")之类的东西来提取JSON字段作为请求参数,而不是每次都创建新的POJO?

3 个答案:

答案 0 :(得分:1)

我不知道春天提供的东西。 但我有一些建议,如果你愿意:)

  1. 您可以从合同中生成Spring模型类(json 架构,或swagger规范)。尽管这至少增加了类 你不是手动维护它
  2. 如果您对太多课程如此关注,那么通用语怎么样? 带有通用字段的类(我会强烈反对这一点)
  3. public class GenericClass {
        private String field1;
        private String field2;
        private String field3;
    }
    

答案 1 :(得分:1)

如果您不需要POJO等强类型性质,则可以使用地图作为@RequestBody@ResponseBody

@RequestMapping(value = "/stuff", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String,Object> stuff(@RequestBody Map<String, Object> yourSimpleObject) {
    Map<String,Object> response = new HashMap<>();
    numMap.put("prop1", "val1");
    numMap.put("prop2", "val2");
    return Collections.unmodifiableMap(response);
}

答案 2 :(得分:-1)

我可以为您提供我的示例Rest Template,使用Facebook API获取用户信息:

String body = this.restTemplate.getForObject("https://graph.facebook.com/v2.6/{id}?fields=first_name,last_name,locale,timezone,gender&access_token={accessToken}", String.class, urlVars);
String locale = JsonPath.read(body, "$.locale");

或者如果你得到json请求:

@RequestMapping(value = "/user", method = RequestMethod.POST)
public ResponseEntity<?> postWebhook(@RequestBody String body) {
    String locale = JsonPath.read(body, "$.locale");
    [...]
}

所以我使用Jsonpath。响应json看起来像:

{ 
  locale : "en_US";
  ...
}

所以我从json:

中读取此属性,然后提取 locale
String locale = JsonPath.read(body, "$.locale");