Spring Boot PutMapping与Enum作为RequestBody问题

时间:2018-10-26 14:55:49

标签: java spring angular spring-boot angular6

我有一个spring boot controller端点,如下。

@PutMapping("/manage/{id}")
public ResponseEntity<Boolean> manage(@PathVariable Long id, @RequestBody 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());

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

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

给我

  

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

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

更新

我还尝试将控制器方法结构更改为

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

我收到以下错误消息。

  

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

1 个答案:

答案 0 :(得分:1)

两个问题均源于试图将JSON端点用作纯文本端点。

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

广告2,当您刚发布一个字符串时,它以text/plain的形式发送,端点抱怨。

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