反序列化JSON空值Jackson java

时间:2015-03-29 15:01:38

标签: ajax json spring-mvc jackson jqwidget

我使用Spring 4 MVC,JQDataTable和Jaskon库将JSON对象从JSP发送到spring控制器。

在表格中,当我点击保存按钮时,我会激活ajax呼叫。这是两个senario。

  1. 我的行可能是旧的:在这种情况下,我有部门ID和hibrnate saveoruupate命令将更新行。
  2. 我的行可能是新的:在这种情况下,我将没有部门ID,而hibernate saveorupdate命令将保存新行。 注意:两个操作都有一个控制器。
  3. 当我点击更新按钮时, 如果row是旧的json对象是"{\"departmentId\":2,\"departmentName\":\"hmkcode\",\"createdBy\":1,\"modifiedBy\":1,\"status\":true}", JSON对象反序列化成功并且update命令成功获取 如果row是新的json对象是 {\"departmentId\":,\"departmentName\":\"hmkcode\",\"createdBy\":1,\"modifiedBy\":1,\"status\":true}",在这种情况下我的部门ID是空的,因此JSON对象不会被解析并给出错误。

    我知道我必须在javascript中处理它以排除部门ID标记(如果它是新行)。 应用程序中会有很多主人,所以每次我必须处理javascript。 Javascript增加代码。 有没有办法在相应的Java模型中处理。我将值初始化为零仍然给出了解析错误。 另外:我必须在Java模型中添加新的命令属性。如果row为new或department id为0则自动将command属性设置为“ADD”,如果row为old,则department id不为零,则将command属性设置为“UPADATE”。

     updateRow: function (rowID, rowData, commit) {
                    var jsonToBeSend="{\"departmentId\":"+rowData.departmentId+",\"departmentName\":\""+rowData.departmentName+"\",\"createdBy\":1,\"modifiedBy\":1,\"status\":"+rowData.status+"}";
    
                    alert(dept)
                    $.ajax({ 
                        url: "/BusinessReimbursment/addDepartment", 
                        type: 'POST', 
                        dataType: 'json', 
                        data: jsonToBeSend,
                        contentType: 'application/json',
                        mimeType: 'application/json',
                        success: function(data) { 
                            alert(data.success + " " + data.message);
                            commit(true);
                        },
                        error:function(data) { 
                           // alert("error: "+data);
                           // $("#dataTable").jqxDataTable('deleteRow', rowID);
                        }
                    });
    
    public class DepartmentDTO implements Serializable{
    private static final long serialVersionUID = 1L;
    
    Integer departmentId=0;
    
    @NotNull
    @Size(min=3,max=30,message="Department lenght should be between 3 to 30 character")
    String departmentName;
    
    Integer createdBy;
    
    Integer modifiedBy;
    @NotNull
    Boolean status;
    }
    

    @Controller

     @RequestMapping(value="/addDepartment", method=RequestMethod.POST)
        public @ResponseBody AjaxResponse addDepartment(@RequestBody final DepartmentDTO departmentDTO){
            AjaxResponse response=new AjaxResponse();
            Department department=DepartmentConvertor.setDepartmentDTOToDepartment(departmentDTO);
            if(Validation.validateForNullObject(department)){
                departmentService.addDepartment(department);
            }
            response.setSuccess(Boolean.TRUE);
            response.setMessage("Record save Successfully");
            return response;
        }
    

    另一个愚蠢的问题。在模型中我应该使用原始变量还是包装类变量? hibernate模型中的同样问题。

    如果你知道JQ Widget那么:我可以将datarow转换为JSON。

1 个答案:

答案 0 :(得分:1)

  

{\" DepartmentID的\":\" DEPARTMENTNAME \":\" hmkcode \" \" createdBy \&# 34;:1,\" modifiedBy \":1,\"状态\":真}&#34 ;,   在这种情况下,我的部门ID是空的,所以JSON对象不会得到   解析并给出错误。

由于departmentId没有值,因此在这种情况下设置null''空值以成功解析JSON。

updateRow: function (rowID, rowData, commit) {
                var jsonToBeSend = new Object();
                if (rowData.departmentId != "" || rowData.departmentId != null){
                 jsonToBeSend["departmentId"] = rowData.departmentId;
                }
                jsonToBeSend["departmentName"] = rowData.departmentName;
                jsonToBeSend["createdBy"] = 1;
                jsonToBeSend["modifiedBy"] = 1;
                jsonToBeSend["status"] = rowData.status;
                $.ajax({ 
                    url: "/BusinessReimbursment/addDepartment", 
                    type: 'POST', 
                    data: JSON.stringify(jsonToBeSend),
                    beforeSend: function(xhr) {                 
                        xhr.setRequestHeader("Accept", "application/json");
                        xhr.setRequestHeader("Content-Type", "application/json");
                    }
                    success: function(data) { 
                        alert(data.success + " " + data.message);
                        commit(true);
                    },
                    error:function(data) { 
                       // alert("error: "+data);
                       // $("#dataTable").jqxDataTable('deleteRow', rowID);
                    }
                });
  在模型中

我应该使用原始变量或包装类   变量?? hibernate模型中的同样问题。

首选Wrapper类,在原始变量中不能存储空值。也改变DTO课程中的以下陈述

从:

Integer departmentId=0;

为:

Integer departmentId;

未保存的新部门模型类应具有null ID。