Подтвердить что ты не робот

Spring Rest POST Json RequestBody Тип содержимого не поддерживается

Когда я пытаюсь опубликовать новый объект с помощью метода post. RequestBody не смог распознать contentType. Spring уже настроен, и POST может работать с другими объектами, но не с этим конкретным.

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

Если я попробую тот же запрос, просто изменив объект запроса. Он работает.

4b9b3361

Ответ 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. После этого проблема была исправлена.