Метод контроллера, который принимает JSON, не работает - PullRequest
0 голосов
/ 02 июня 2019

Мне трудно получить комплексный 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 . Я просто удалил указанную аннотацию, но сохранил Обратную ссылку в одну сторону.

1 Ответ

0 голосов
/ 03 июня 2019

Моя проблема была решена.Оказывается, проблема была в аннотации Джексона, @ JsonManagedReference .Я просто удалил указанную аннотацию, но сохранил Обратную ссылку в одну сторону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...