При тестировании контроллера 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 для соответствия настройкам @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; }
Аннотирован ли ваш контроллер аннотацией @RestController?
Также подтвердите, что вы отправляете JSON (а не простой текст, как указано в заголовке). Вы добавляли заголовок Accept в свой запрос? Вы также можете воспроизвести переключение атрибута consumes с MediaType.APPLICATION_PROBLEM_JSON_UTF8_VALUE на MediaType.APPLICATION_PROBLEM_JSON_VALUE и обратно.
Нет, не работает. Может быть, из-за cookie, потому что я могу успешно использовать другой POST API, и я по ошибке удалил cookie для API, который мы пытаемся разрешить. В cookie для этого API параметр HTTP отправляется в false, тогда как в API, который работает нормально, это правда.
это может быть из-за отсутствия потребляет и производит значения внутри @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;
}
Пробовал ваше предложение, но безрезультатно.
измените is_active на isActive, а установщик - на setIsActive. Я подозреваю, что Джексон не может найти соответствующий сеттер для is_active из-за соглашения об именах и, следовательно, не может проанализировать объект
Можете проверить headerRequest !!!!!, я думаю, что есть какие-то ошибки в настройке в шапке. Сфокусируйтесь на "Content-Type", вы должны установить ""
Чем помечен ваш контроллер?
@RestController?