接受JSON的控制器方法不起作用

时间:2019-06-02 14:05:06

标签: java json spring rest

我很难通过HTTP PUT (使用Spring MVC)使服务器接受复杂的JSON。

我有两个实体:

  

建筑物

@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请求。 (来自ID为“主表单”的表单)

$("#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中具有几乎相同的代码,并且工作起来很吸引人。但是我似乎无法使其与此实体一起工作。

编辑

我的问题已解决。原来问题出在杰克逊的注解 @JsonManagedReference 上。我只是删除了上述注释,但将“后向引用”保留在一侧。

1 个答案:

答案 0 :(得分:0)

我的问题已解决。原来问题出在杰克逊的注解 @JsonManagedReference 上。我只是删除了上述注释,但将“后向引用”保留在一侧。