Получение кода состояния 415 при тестировании Post API с сообщением "message": "Content type 'text / plain; charset = UTF-8' not supported"

При тестировании контроллера REST (разработанного с помощью SpringBoot) с помощью Postman неоднократно получал код состояния 415.

Происходит только с конкретными почтовыми запросами. другие почтовые запросы работают нормально. Имитировали работающие почтовые контроллеры на неисправные, но безуспешно.

@RequestMapping(value = "/addtheatre", method= RequestMethod.POST)
public HttpStatus addTheatre(@RequestBody Theatre theatre ) {
theatrerepository.save(theatre);
return HttpStatus.OK;

}

Театральная сущность: - пакет com.example.Model;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.stereotype.Component;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.sql.Time;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


@Entity(name = "Theatre")
public class Theatre {

    Theatre()
    {}
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "Id")
    private long id;
    @Column(name = "name")
    @NotNull
    private String name;
    @Column(name = "address")
    @NotNull
    private String address;
    @Column(name = "city")
    @NotNull
    private String city;
    @Column(name = "is_active")
    @NotNull
    private Boolean is_active;
    @Transient
    private List<TheatreHall> halls;
    @Transient
    private Map <Movie,LinkedList<Time>> map;

    public Boolean getIs_active() {
        return is_active;
    }

    public void setIs_active(Boolean is_active) {
        this.is_active = is_active;
    }

    public List<TheatreHall> getHalls() {
        return halls;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setHalls(List<TheatreHall> halls) {
        this.halls = halls;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Map<Movie, LinkedList<Time>> getMap() {
        return map;
    }

    public void setMap(Map<Movie, LinkedList<Time>> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Theatre{" +
                "id = " + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", city='" + city + '\'' +
                ", is_active = " + is_active +
                ", halls = " + halls +
                ", map = " + map +
                '}';
    }

}

Тестовые данные почтальона следующие: -

Конечная точка: -localhost: 8080 / addtheatre

Запрос:-

{   
"name":"PVR Mall",
"address":"Andheri",
"city":"Mumbai",
"is_active":"true"
}

Ответ:-

{
    "timestamp": "2018-12-26T08:21:43.269+0000",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/json;charset=UTF-8' not supported",
    "path": "/addtheatre"
}

Ожидается состояние ОК для этого контроллера POST.

Чем помечен ваш контроллер? @RestController?

Boris the Spider 26.12.2018 09:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
430
4

Ответы 4

В случае, если вы используете @RestController для соответствия настройкам @RequestMapping по умолчанию, убедитесь, что вы установили application/json как для заголовков Content-Type, так и для Accept.

Если вам нужно отправить именно json в кодировке UTF-8, вам нужно будет явно установить атрибут consumes:

@RequestMapping(value = "...", method = ...,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)

Также может быть неявная проблема Джексона с логическим установщиком. Попробуйте изменить поле is_active (которое не соответствует соглашению) на active, а его getter \ setter выглядит следующим образом:

private boolean active;

@JsonProperty(value = "is_active")       //if needed  
public boolean isActive() {
    return this.active;
}

public void setActive(boolean active) {
    this.active = active;
}

Считал, но все та же ошибка. Контроллер и сущность: - Спецификация сущности: - @JsonProperty (value = "is_active") public Boolean getisactive () {return isactive; } public void setisactive (логическое значение isactive) {this.isactive = isactive; } Контроллер выглядит следующим образом: - @RequestMapping (value = "/ addtheatre", method = RequestMethod.POST, consumes = MediaType.APPLICATION_PROBLEM_JSON_UTF8_VALUE) public HttpStatus addTheatre (@RequestBody Theater Theater) {theatrerepository.save (theatrerepository); вернуть HttpStatus.OK; }

Ravi Singh Shekhawat 26.12.2018 13:17

Аннотирован ли ваш контроллер аннотацией @RestController?

Anton Hlinisty 26.12.2018 13:31

Также подтвердите, что вы отправляете JSON (а не простой текст, как указано в заголовке). Вы добавляли заголовок Accept в свой запрос? Вы также можете воспроизвести переключение атрибута consumes с MediaType.APPLICATION_PROBLEM_JSON_UTF8_VALUE на MediaType.APPLICATION_PROBLEM_JSON_VALUE и обратно.

Anton Hlinisty 26.12.2018 13:44

Нет, не работает. Может быть, из-за cookie, потому что я могу успешно использовать другой POST API, и я по ошибке удалил cookie для API, который мы пытаемся разрешить. В cookie для этого API параметр HTTP отправляется в false, тогда как в API, который работает нормально, это правда.

Ravi Singh Shekhawat 26.12.2018 15:29

это может быть из-за отсутствия потребляет и производит значения внутри @RequestMapping метода веб-службы,
может добавить те:

@RequestMapping(value = "/addtheatre", method= RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE}, produces = { MediaType.APPLICATION_JSON_VALUE})
public HttpStatus addTheatre(@RequestBody Theatre theatre ) {
   theatrerepository.save(theatre);
return HttpStatus.OK;

}

Пробовал ваше предложение, но безрезультатно.

Ravi Singh Shekhawat 26.12.2018 13:21

измените is_active на isActive, а установщик - на setIsActive. Я подозреваю, что Джексон не может найти соответствующий сеттер для is_active из-за соглашения об именах и, следовательно, не может проанализировать объект

Можете проверить headerRequest !!!!!, я думаю, что есть какие-то ошибки в настройке в шапке. Сфокусируйтесь на "Content-Type", вы должны установить ""

Другие вопросы по теме