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 中 10 行代码构建 RESTful 风格应用
如何在 Spring Boot Restful 中更改大量数据(更新多个数据)
Spring boot - 如何在 rest 应用程序中验证 Multipartfile
@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping