当前位置: 首页 > 知识库问答 >
问题:

Spring PostMapping接收具有空值的对象

融修平
2023-03-14

我正在编写一个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(.........

我已经读过了,但是如果我把@RequestBody放到

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

即使我把consumes=MediaType。所有值属性。

我知道我可以通过另一次调用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) {

共有1个答案

逑禄
2023-03-14

当您添加@RequestBody时,您需要json数据,但需要从客户端发送表单数据。

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

 类似资料:
  • 问题内容: 我有一个AngularJSWeb应用程序,看起来它正确地将JSON发送到Tomcat服务器,但是服务器接收到空值。这个问题没有帮助,因为我的属性名称已经是小写字母,这个问题也没有帮助,因为我已经有了符号。 编辑:正如评论中指出的那样,我实际上没有这种表示法。 我读错了。 这是有问题的服务器方法: 这是它希望接收的Kind对象: 这是发出请求的方法: 这是发送到服务器的JSON: 注意:

  • 我有一个AngularJS Web应用程序,它看起来像是正确地将JSON发送到Tomcat服务器,但是服务器接收空值。这个问题没有帮助,因为我的属性名称已经是小写的,这个问题没有帮助,因为我已经得到了符号。编辑:正如评论中指出的,我实际上没有这个符号。我看错了。 下面是有问题的服务器方法: 以下是它期望接收的Kind对象: 以下是发出请求的方法: 这是发送到服务器的JSON: 注意:我假设我可以不

  • 我正在使用一个可打包对象来传递一个意图。我的对象看起来是这样的 公共类配方实现Parcelable{private List Recipe=null;private List firedents=null;private String preparation; 我调试了这部分代码,我知道sendRecipe对象是实例化的,数据是正确的。所以我把这个东西放在意向性上,然后把它发送到下一个活动 在这个

  • 使用Apache camel 2.15.3创建了SOAP服务,一切正常,即使响应SOAP正文也是有效的。 骆驼2.15.3依赖于cxf 3.0.6 但是当我将cxf-core更新到3.1.3时,一切都很好,除了SOAP响应体是空的。 没有错误日志,服务器启动正常。 我是否缺少一些依赖项? POM。xml

  • 问题内容: 我们有一些代码根据其坐标之间的距离对地址列表进行排序。这是通过使用自定义比较器的collections.sort完成的。 但是,列表中有时不包含地址,这会导致NullPointerException。解决这个问题的最初想法是让比较器返回至少0个坐标为零的地址的距离。我担心这可能导致列表中“有效”元素的顺序损坏。 因此是否可以在比较器中为空数据返回“ 0”值,还是有一种更干净的方法来解决

  • 考虑这个简单的例子: 此代码将打印,但是,如果我对每个