Мне трудно получить комплексный JSON для принятия сервером с HTTP PUT (с использованием Spring MVC) .
У меня есть две сущности:
Строительство
@Entity
@Table
public class Building {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "description")
private String description;
@OneToMany(mappedBy = "building", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
@JsonBackReference
private Set<Floor> floors;
// Default Constructor, Getters, Setters
}
Пол
@Entity
@Table
public class Floor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST})
@JsonManagedReference
private Building building;
@Column(name = "number", nullable = false)
private short number;
@Column(name = "description")
private String description;
// Default Constructor, Getters, Setters
}
Контроллер
@RestController
@RequestMapping("/admin/Floors")
public class AdminFloorController {
// Autowired Floor Service + Setter
// Other methods
@PutMapping(value = "/Save",
consumes = "application/json",
produces = MediaType.TEXT_HTML_VALUE)
public ResponseEntity<String> save(@RequestBody Floor floor) {
return floorService.save(floor) ?
new ResponseEntity<String>("Floor was successfully saved.", HttpStatus.OK) :
new ResponseEntity<String>("Floor was not saved. An error may have occured.", HttpStatus.OK);
}
}
А вот и запрос AJAX. (Из формы с идентификатором main-form)
$("#main-form").submit(function(e) {
e.preventDefault();
$.ajax({
type: "PUT",
url: "Floors/Save",
data: JSON.stringify({
"id": $("#main-form").find("input[name='id']").val(),
"number": $("#main-form").find("input[name='number']").val(),
"building": {
"id": $("#main-form").find("select[name='building.id']").val()
}
}),
contentType: "application/json",
success: function(data) {
$("#main-modal").modal("hide");
createTable();
}
});
});
Запрос AJAX правильно скомпонован вместе с объектом JSON. Но при отправке сервер всегда отвечает Ошибка 415: неподдерживаемый тип носителя.
Я явно сказал AJAX отправить запрос с телом JSON с кодом:
contentType: "application / json"
, а метод контроллера обозначен:
@ PutMapping (url, потребляет = "application / json")
но это не работает. У меня почти тот же код в моем Building REST Controller, и он работает как шарм. Но я просто не могу заставить его работать с этой сущностью.
EDIT
Моя проблема была решена. Оказывается, проблема была в аннотации Джексона, @ JsonManagedReference . Я просто удалил указанную аннотацию, но сохранил Обратную ссылку в одну сторону.