【问题标题】:Spring boot Rest controller - convert form-encoded body to POJOSpring Boot Rest 控制器 - 将表单编码的主体转换为 POJO
【发布时间】:2015-08-31 13:20:35
【问题描述】:

我想处理一个到达我的休息端点的 HTTP POST 请求,并将其正文转换为我定义的 POJO。过去我在 JSON 和 POJO 之间的映射方面取得了成功,但我正在努力处理这种形式编码的内容。

我有一个控制器如下:

@Slf4j
@RestController("/example")
public class GatewayController {

    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void describeInstances(@RequestBody MyPojo body) {

        log.debug("Value1: " + body.getValue1());

    }

}

还有一个 POJO:

@Data
public class MyPojo {

 private String value1;
 private String value2;
 ...
}

我正在使用如下所示的 POST 请求访问控制器:

Content-Type: application/x-www-form-urlencoded
Body: value1=abc&value2=efg...

但我得到的只是415 Unsupported Media Type。任何帮助表示赞赏。

编辑:当我将 POJO 更改为 String 并打印正文时,它可以工作(没有收到不受支持的媒体类型异常),所以它肯定在 POJO 声明中。

跟进:

是否可以注释 POJO 属性以允许不同的字段名称(例如,避免在变量名称中使用 undorscope)?

类似:

@Attribute("value_name")
private String valName;

【问题讨论】:

  • 您是否使用 Jackson 进行 JSON-POJO 绑定?您是否看到杰克逊的任何错误,例如“没有构造函数来制作 MyPojo”?
  • 请求正文中的数据不是 JSON 而是表单编码的。所以不需要杰克逊,对吧?除了 415 之外,我没有收到任何异常...
  • 你当然是对的,你不需要杰克逊。你可能仍然需要定义一个默认构造函数。

标签: java spring rest spring-boot httprequest


【解决方案1】:

@ModelAttribute 是在控制器中获取表单数据的推荐方式。例如

public void describeInstances(@ModelAttribute("mypojo") MyPojo body)

@Data
@ModelAttribute("mypojo")
public class MyPojo {

阅读 spring 文档以获取更多信息here

【讨论】:

  • 谢谢,这正是我需要的。至于我的问题 - 如何为类属性分配自定义名称?这可能吗,但名称必须每次都匹配吗?
  • 我不熟悉一种简单的方法来做到这一点。我实际上认为使用相同的名称是一种很好的做法,但这只是我自己。
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 2020-10-10
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2017-11-06
相关资源
最近更新 更多