Spring Boot PutMapping 与 Enum 作为 RequestBody 问题

Posted

技术标签:

【中文标题】Spring Boot PutMapping 与 Enum 作为 RequestBody 问题【英文标题】:Spring boot PutMapping with Enum as RequestBody issue 【发布时间】:2019-03-31 08:54:57 【问题描述】:

我有一个如下的 spring boot 控制器端点。

@PutMapping("/manage/id")
public ResponseEntity<Boolean> manage(@PathVariable Long id, @RequestBody Type type)  
  ...

其中 Type 是一个枚举,如下所示。

public enum Type 
    ONE,
    TWO

问题 1: 当我测试这个控制器时,我必须将内容发送为 "ONE" 而不是 ONE 才能成功调用。即它适用于以下代码。

mvc.perform(put("/api/manage/1")
            .contentType(MediaType.APPLICATION_JSON_VALUE)
            .content("\"" + Type.ONE + '\"'))
            .andExpect(status().isOk());

不适合

mvc.perform(put("/api/manage/1")
            .contentType(MediaType.APPLICATION_JSON_VALUE)
            .content(Type.ONE.name()))
            .andExpect(status().isOk());

ISSUE 2:我无法从 Angular 服务调用此方法。

this.http.put<string>('/api/manage/' + id, type)

给我

org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型'text/plain;charset=UTF-8'

当我将 Enum 添加到 Dto 并从客户端发送对象时,一切正常。但是由于一些业务需求,我想使用当前的结构本身。即枚举为RequestBody

更新

我也试过把控制器方法结构改成

@PutMapping(value = "/manage/id", consumes = MediaType.TEXT_PLAIN_VALUE)

我收到以下错误。

不支持内容类型“文本/纯文本”

【问题讨论】:

您找到任何解决方案了吗?我也面临着类似的挑战。 【参考方案1】:

这两个问题都源于尝试将 JSON 端点用作纯文本端点。

广告 1,ONE 无效 JSON("ONE" 有效)

广告2,当你只是发布一个字符串时,它被发送为text/plain并且端点抱怨。

可能将consumes="text/plain" 添加到您的@PutMapping 将解决问题,但坦率地说 - 我不确定字符串/枚举映射是否在春季启动的大杂烩中开箱即用。

【讨论】:

实际上我已经添加了这个......但我得到了一个类似的错误,只是 ;charset=UTF-8 丢失了。请检查更新的问题

以上是关于Spring Boot PutMapping 与 Enum 作为 RequestBody 问题的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot restful put方式提交表单

Spring Boot 中 10 行代码构建 RESTful 风格应用

为 Spring Boot 制作黑名单 JWT 令牌

如何在 Spring Boot Restful 中更改大量数据(更新多个数据)

Spring boot - 如何在 rest 应用程序中验证 Multipartfile

@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping