Spring Rest POST Json RequestBody Тип содержимого не поддерживается
Когда я пытаюсь опубликовать новый объект с помощью метода post. RequestBody не смог распознать contentType. Spring уже настроен, и POST может работать с другими объектами, но не с этим конкретным.
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
Если я попробую тот же запрос, просто изменив объект запроса. Он работает.
Ответы
Ответ 1
Я нашел решение.
Это было потому, что у меня было 2 сеттера с таким же именем, но с другим типом.
В моем классе было свойство id int, которое я заменил Integer, когда à Hibernitify мой объект.
Но, по-видимому, я забыл удалить сеттеры, и у меня было:
/**
* @param id
* the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @param id
* the id to set
*/
public void setId(Integer id) {
this.id = id;
}
Когда я удалил этот сеттер, остальное покорение очень хорошо работает.
Интегрировать, чтобы выбросить ошибку отмены или отразить ошибку класса. Исключение HttpMediaTypeNotSupported Исключительные швы действительно странные здесь.
Я надеюсь, что этот stackoverflow может помочь кому-то другому.
ПРИМЕЧАНИЕ СТОРОНЫ
Вы можете проверить консоль Spring сервер для следующего сообщения об ошибке:
Не удалось оценить десериализацию Джексона для типа [простой тип, class your.package.ClassName]: com.fasterxml.jackson.databind.JsonMappingException: Конфликтующий определения сеттера для свойства "propertyname"
Тогда вы можете быть уверены, что имеете дело с проблемой, упомянутой выше.
Ответ 2
Помните также, если вы объявили геттеры и сеттеры для атрибутов параметра, которые не отправлены в POST (событие, если они не объявлены в конструкторе), например:
@RestController
public class TestController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(@RequestBody BeanTest beanTest) {
return "Hello " + beanTest.getName();
}
public static class BeanTest {
private Long id;
private String name;
public BeanTest() {
}
public BeanTest(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
Почтовый запрос со следующей структурой: { "id": "1" } не будет работать, вы должны удалить имя get и установить.
Ответ 3
Если вы используете lombok, вы можете получить эту ошибку, если вы напортачили с именами @JsonDeserialize, например:
@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeOtherClassBuilder.class)
public class SomeClass {
...
public static class SomeOtherClassBuilder {
...
}
}
Это должно быть:
@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeClassBuilder.class)
public class SomeClass {
...
public static class SomeClassBuilder {
...
}
}
Это очень легко сделать, если вы выполните рефакторинг имени класса и забудете о Builder... и у вас будет много часов радости, когда вы будете искать причину ошибки, а в качестве справки получите только крайне бесполезное сообщение об исключении.
Ответ 4
Действительно! после 4 часов и безумной отладки я нашел этот очень странный код в com.fasterxml.jackson.databind.deser.DeserializerCache
if (deser == null) {
try {
deser = _createAndCacheValueDeserializer(ctxt, factory, type);
} catch (Exception e) {
return false;
}
}
Ya, проблема была двойной сеттер.
Ответ 5
В моем случае у меня было два конструктора в bean, и у меня была такая же ошибка. Я только что удалил один из них, и теперь проблема исправлена!
Ответ 6
У меня была такая же проблема, когда у меня было два сеттера с Enum и одной String. Мне пришлось использовать аннотацию @JsonSetter, которая сообщает Джексону, какой метод setter использовать во время сериализации. Это решило мою проблему.
Ответ 7
Я встретил ту же проблему, которую я решил, десериализируя себя опубликованное значение:
@RequestMapping(value = "/arduinos/commands/{idArduino}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String sendCommandesJson(@PathVariable("idArduino") String idArduino, HttpServletRequest request) throws IOException {
// getting the posted value
String body = CharStreams.toString(request.getReader());
List<ArduinoCommand> commandes = new ObjectMapper().readValue(body, new TypeReference<List<ArduinoCommand>>() {
});
с тезисами gradle зависимостей:
compile('org.springframework.boot:spring-boot-starter-web')
compile('com.google.guava:guava:16.0.1')
Ответ 8
Итак, у меня была аналогичная проблема, когда у меня был bean с некоторым перегруженным конструктором. Этот bean также имел необязательные свойства.
Чтобы разрешить это, я просто удалил перегруженные конструкторы и работал.
Пример:
public class Bean{
Optional<String> string;
Optional<AnotherClass> object;
public Bean(Optional<String> str, Optional<AnotherClass> obj){
string = str;
object = obj;
}
///The problem was below constructor
public Bean(Optional<String> str){
string = str;
object = Optional.empty();
}
}
}
Ответ 9
укажите @JsonProperty в конструкторе класса сущностей следующим образом.
......
......
......
@JsonCreator
public Location(@JsonProperty("sl_no") Long sl_no,
@JsonProperty("location")String location,
@JsonProperty("location_type") String
location_type,@JsonProperty("store_sl_no")Long store_sl_no) {
this.sl_no = sl_no;
this.location = location;
this.location_type = location_type;
this.store_sl_no = store_sl_no;
}
.......
.......
.......
Ответ 10
попробуйте добавить зависимость Джексона
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
<exclusions>
<exclusion>
<artifactId>jackson-annotations</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
Ответ 11
Это выглядит как старая нить, но в случае, если кто-то все еще борется, я решил, как сказал Тибо,
Избегайте использования двух сеттеров класса POJO, у меня было два сеттера для определенного свойства. Первый был в обычном сеттере, а другой - в конструкторе после того, как я удалил тот в конструкторе, который работал.
Ответ 12
Я была такая же проблема. Основной причиной было использование пользовательского десериализатора без конструктора по умолчанию.
Ответ 13
У меня была такая же проблема, когда я использовал это как внешний ключ.
@JsonBackReference
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH},fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User user;
Затем я удалил аннотацию @JsonBackReference
. После этого проблема была исправлена.