У меня есть конечная точка контроллера загрузки Spring следующим образом.
@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: Content type 'text/plain;charset=UTF-8' not supported
Все работает, когда я добавляю Enum в Dto и отправляю объект от клиента. Но из-за некоторых бизнес-требований я хочу использовать саму текущую структуру. то есть Enum как RequestBody.
ОБНОВИТЬ
Я также попытался изменить структуру метода контроллера на
@PutMapping(value = "/manage/{id}", consumes = MediaType.TEXT_PLAIN_VALUE)
Я получаю следующую ошибку.
Content type 'text/plain' not supported




Обе проблемы связаны с попыткой использовать конечную точку JSON в качестве конечной точки с простым текстом.
Объявление 1, ONE недействителен JSON (действителен "ONE")
Объявление 2: когда вы просто публикуете строку, она отправляется как text/plain, и конечная точка жалуется.
Вероятно, добавление consumes = "text/plain" к вашему @PutMapping решит проблему, но, честно говоря, я не уверен, работают ли сопоставления строк / перечислений из коробки в мешанине, которая является весенней загрузкой.
Вообще-то я это добавил ... Но у меня такая же ошибка, просто отсутствует ;charset=UTF-8. Пожалуйста, проверьте обновленный вопрос
Вы смогли найти какое-нибудь решение? Я столкнулся с аналогичной проблемой.