Spring Boot解析@RequestBody

时间:2018-12-11 01:39:45

标签: java spring spring-boot

我有一个旧的端点,我正在尝试升级到使用Spring Boot。目前有一些服务使用它,因此我希望保持不变。

旧端点接受=G11的请求正文。

例如=G17

我怎样才能像我以前的终结点一样完全接受请求正文,却可以将输入映射到对象中呢?

旧的端点正在使用Apache Access,就像这样。它被配置为将类中的任何公共方法转换为端点。

userName=1234&password=1234

我已经将它翻译成Spring Boot了

curl -X POST "http://localhost:8080/AuthService/login" -H  "accept: */*" -H  "Content-Type: application/json" -d "userName=123&password=123"

但是将请求主体转换为对象的方法确实很丑陋且容易出错,我想对其进行改进。

3 个答案:

答案 0 :(得分:1)

Spring Boot将自动为您将json映射到对象。只需在请求正文注释后删除括号,使参数类型登录,然后从登录名中删除构造函数即可。

@ApiOperation(value = "To login", response = RequestStatus.class)
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<ReturnValue> login(@RequestBody Login login) {
    ....
}

public class Login {

    private String password;
    private String userName;
    .... // getters
}

答案 1 :(得分:1)

首先,将主体转换为地图:

public Map<String, String> bodyToMap(String bodyStr) {
  Map<String, String> body = new HashMap<>();
  String[] values = bodyStr.split("&");
  for (String value : values) {
    String[] pair = value.split("=");
    if (pair.length == 2) {
      body.put(pair[0], pair[1]);
    }
  }
  return body;
}

然后使用杰克逊的ObjectMapper将地图隐藏到您的POJO中

ObjectMapper mapper = new ObjectMapper();
Map<String, String> body = bodyToMap(info);
Login loginInfo = mapper.convertValue(body, Login.class);

您可以在此处检查更有效的queryparam样式的字符串以映射转换器(如果您有更多具有相同密钥(例如key1=value1_1&key1=value1_2&key2=value2_1的旧式端点,则应该这样做):Parse a URI String into Name-Value Collection

答案 2 :(得分:0)

在您的方法中添加consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,还将您的输入参数更改为@RequestParam映射。

@RequestMapping(value = "/login", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public @ResponseBody ResponseEntity<ReturnValue> login(@RequestParam Map<String, String> body) {
    String username = body.get("username");
    String password = body.get("password");

    //authenticate etc..

    return ResponseEntity.ok(returnValue);
}