【问题标题】:Spring PostMapping receive object with null valuesSpring PostMapping 接收具有空值的对象
【发布时间】:2018-08-04 20:34:35
【问题描述】:

我正在编写一个 SPRING 控制器来管理一些实体,我在尝试编辑现有对象时遇到了麻烦。

这是产生问题的 get/post 映射:

@GetMapping(value = "/category/{id}/edit")
public String editCategoryGET(@PathVariable int id, Model model) {
    Category category = repositoriesServices.getCategoryById(id);
    log.info("editCategoryGET: " + category);
    // set model attribute etc....
}

@PostMapping(value = "/category/{id}/edit")
public @ResponseBody
ResponseEntity editCategoryPOST(@PathVariable int id, Category category) {
    log.info("editCategoryPOST: " + category);
    // code...
}

类别类是这样的:

@Entity
@Table(name = "categories")
public class Category {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private int id;

    private String name;

    @Lob
    private String imageBase64;

    @Transient
    private MultipartFile image;

    // getter setter
}

当我尝试编辑 Category 对象时,它来自 DB,正如您在日志底部看到的那样,但当它来自 POST 时,imageBase64 字段是 null

editCategoryGET: Category{id=1, name='vdsvsdv', imageBase64='data:image/png;base6...'}
editCategoryPOST: Category{id=1, name='vdsvsdv', imageBase64='null'}

ajaxPOST调用是这样完成的:

var form = $('#form');
$.ajax({
    type: "POST",
    url: form.attr("action"),
    data: new FormData(form[0]),
    processData: false,
    contentType: false,
    dataType: 'json'
}).done(.........

我已经阅读了this,但如果我输入@RequestBody,我会收到此错误:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryZJlpA2NOKy6YhELW;charset=UTF-8' not supported

即使我放了consumes = MediaType.ALL_VALUE属性。

我知道我可以通过另一个调用 DB 来获取旧数据来解决,但我希望有一个最干净的方法

解决方案: 我已经解决了编辑后发送 json 数据的问题:

function getFormDataAsJSON() {
    var json = {};
    json.name = $('#name-input').val();
    json.imageBase64 = $('#logo-preview').attr('src');
    return json;
}


var form = $('#form');
var postData = {};
postData.formData = new FormData(form[0]);
var flag = false;
if ($('#div-visible-only-in-edit-way').length !== 0) {
    flag = true;
    postData.jsonData = getFormDataAsJSON();
}
$.ajax({
    type: "POST",
    url: form.attr("action"),
    data: flag ? JSON.stringify(postData.jsonData) : postData.formData,
    processData: false,
    contentType: flag ? "application/json; charset=utf-8" : false,
    dataType: 'json'
}).done(function (e) {

【问题讨论】:

  • 当您添加 @RequestBody 时,您期望的是 json 数据,但会从客户端发送表单数据。将您的 javascript 代码更改为发送 json 数据。
  • 我已经解决了你的评论,如果你把它作为答案,我会接受正确的
  • 我很高兴它有帮助,添加评论以帮助其他人。另外,我建议您使用有效请求编辑您的答案。
  • 我已经完成了,再次感谢您!

标签: javascript java spring spring-mvc spring-boot


【解决方案1】:

当您添加 @RequestBody 时,您期望的是 json 数据,但会从客户端发送表单数据。

您应该更改您的 javascript 代码以发送 json 请求。

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 2023-01-12
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2020-12-02
    • 2011-10-04
    • 2022-11-17
    相关资源
    最近更新 更多