是否可以在Spring REST服务中使用@RequestParam之类的JSON?

hi3rlvi2  于 2023-08-02  发布在  Spring
关注(0)|答案(3)|浏览(100)

我使用Sping Boot ,我正在用Spring编写REST服务器,我有很多不同的请求Map,我需要接受json中的内容
我可以使用@RequestBody注解来实现这一点,但在本例中,我将为每个请求和每个可能的响应提供大量POJO类。
我需要发送和接收的很多JSON都非常简单-一个、两个或三个值
是否可以使用@RequestParam("field1_from_my_json")@RequestParam("field2_from_my_json")来提取JSON字段作为请求参数,而不是每次都创建新的POJO?

3phpmpom

3phpmpom1#

我没有意识到Spring所提供的任何东西。但我有一些建议,如果你愿意:)
1.您可以从合约(json schema或swagger spec)生成Spring模型类。即使这增加了类,至少您不用手动维护它
1.如果您担心类太多,那么一个带泛型字段的泛型类怎么样(尽管我强烈反对这样做)

public class GenericClass {
    private String field1;
    private String field2;
    private String field3;
}

字符串

9nvpjoqh

9nvpjoqh2#

如果你不需要POJO等的强类型特性,你可以使用Map作为@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);
}

字符串

kse8i1jr

kse8i1jr3#

我可以为您提供我的示例Rest模板,使用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";
  ...
}


所以我提取 locale 只是从json阅读这个属性:

String locale = JsonPath.read(body, "$.locale");

相关问题