12

我在通过杰克逊解析器、ajax 和 jquery 将对象数组传递给控制器​​时遇到问题。

我的控制器如下所示:

@RequestMapping(value="/saveTimeBooking")
public @ResponseBody ReturnTO saveTimeBooking(@RequestBody TimesheetTO timesheetTO[]) {
    // ...
}

我的 Java 对象 TimesheetTO 如下所示:

public class TimesheetTO implements Serializable {
    private static final long serialVersionUID = 1L;

    private int activityMasterId;
    private String name;

    private BigDecimal mondayEffort=new BigDecimal(0);
    private BigDecimal tuesdayEffort=new BigDecimal(0);
    private BigDecimal wednesdayEffort=new BigDecimal(0);
    private BigDecimal thursdayEffort=new BigDecimal(0);
    private BigDecimal fridayEffort=new BigDecimal(0);
    private BigDecimal saturdayEffort=new BigDecimal(0);
    private BigDecimal sundayEffort=new BigDecimal(0);
    public int getActivityMasterId() {
        return activityMasterId;
    }
    public String getName() {
        return name;
    }
    public BigDecimal getMondayEffort() {
        return mondayEffort;
    }
    public BigDecimal getTuesdayEffort() {
        return tuesdayEffort;
    }
    public BigDecimal getWednesdayEffort() {
        return wednesdayEffort;
    }
    public BigDecimal getThursdayEffort() {
        return thursdayEffort;
    }
    public BigDecimal getFridayEffort() {
        return fridayEffort;
    }
    public BigDecimal getSaturdayEffort() {
        return saturdayEffort;
    }
    public BigDecimal getSundayEffort() {
        return sundayEffort;
    }
    public void setActivityMasterId(int activityMasterId) {
        this.activityMasterId = activityMasterId;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setMondayEffort(BigDecimal mondayEffort) {
        this.mondayEffort = mondayEffort;
    }
    public void setTuesdayEffort(BigDecimal tuesdayEffort) {
        this.tuesdayEffort = tuesdayEffort;
    }
    public void setWednesdayEffort(BigDecimal wednesdayEffort) {
        this.wednesdayEffort = wednesdayEffort;
    }
    public void setThursdayEffort(BigDecimal thursdayEffort) {
        this.thursdayEffort = thursdayEffort;
    }
    public void setFridayEffort(BigDecimal fridayEffort) {
        this.fridayEffort = fridayEffort;
    }
    public void setSaturdayEffort(BigDecimal saturdayEffort) {
        this.saturdayEffort = saturdayEffort;
    }
    public void setSundayEffort(BigDecimal sundayEffort) {
        this.sundayEffort = sundayEffort;
    }

    public TimesheetTO(){}

    public TimesheetTO( String activityMasterId, 
                        String name, 
                        String mondayEffort,
                        String tuesdayEffort,
                        String wednesdayEffort,
                        String thursdayEffort,
                        String fridayEffort,
                        String saturdayEffort,
                        String sundayEffort)
    {
        this.activityMasterId=Integer.parseInt(activityMasterId);
        this.name=name;
        this.mondayEffort=BigDecimal.valueOf(Double.parseDouble(mondayEffort));
        this.tuesdayEffort=BigDecimal.valueOf(Double.parseDouble(tuesdayEffort));
        this.wednesdayEffort=BigDecimal.valueOf(Double.parseDouble(wednesdayEffort));
        this.thursdayEffort=BigDecimal.valueOf(Double.parseDouble(thursdayEffort));
        this.fridayEffort=BigDecimal.valueOf(Double.parseDouble(fridayEffort));
        this.saturdayEffort=BigDecimal.valueOf(Double.parseDouble(saturdayEffort));
        this.sundayEffort=BigDecimal.valueOf(Double.parseDouble(sundayEffort));
    }
}

而且,我正在使用以下 jquery 代码将时间表对象数组传递给控制器​​:

var datacounter=0;
/*var totalcount=0;*/
var timesheetTO = new Array();

$("#timeSheetTableId input[id^=activityMasterId]").each(function() {
       $('#activityMasterId_'+datacounter).removeAttr('disabled');
       $('#name_'+datacounter).removeAttr('disabled');

       timesheetTO.push({
           "activityMasterId": $('#activityMasterId_'+datacounter).val(),
           "name": $('#name_'+datacounter).val(),
           "mondayEffort": new Integer($('#mondayEffort_'+datacounter).val()),
           "tuesdayEffort": $('#tuesdayEffort_'+datacounter).val(),
           "wednesdayEffort": $('#wednesdayEffort_'+datacounter).val(),
           "thursdayEffort": $('#thursdayEffort_'+datacounter).val(),
           "fridayEffort": $('#fridayEffort_'+datacounter).val(),
           "saturdayEffort": $('#saturdayEffort_'+datacounter).val(),
           "sundayEffort": $('#sundayEffort_'+datacounter).val()
       });
       datacounter=datacounter+1;
});

var url = contextRoot + "timesheet/saveTimeBooking.htm";
$.ajax({
    type : 'POST',
    url : url,
    async : false,
    timeout : 5000,
    contentType: 'application/json',
    dataType: 'json',
    data : {
        timesheetTO : JSON.stringify(timesheetTO)
    },
    success : function(data, textStatus) {
        alert('successful');

    },
    error : function(xhr, textStatus, errorThrown) {
        alert('request failed in saving timesheet:' + errorThrown + " " + textStatus + " "
                + xhr.toString());
    }
});

提交时,我收到上面给出的错误:Jacskon parsor exception: Unrecognized token 'tieheT': was expecting 'null', 'true' or 'false'

我做错了什么..有什么办法可以解决这个问题吗?

这是结果JSON.stringify

 [{"activityMasterId":"1","name":"Financial Implications","mondayEffort":"0","tuesdayEffort":"0","wednesdayEffort":"0","thur‌​sdayEffort":"0","fridayEffort":"0","saturdayEffort":"0","sundayEffort":"0"},{"act‌​ivityMasterId":"2","name":"Cost estimation","mondayEffort":"0","tuesdayEffort":"0","wednesdayEffort":"0","thursd‌​ayEffort":"0","fridayEffort":"0","saturdayEffort":"0","sundayEffort":"0"}] 
4

5 回答 5

8

问题是您传递的字符串值缺少引号,因此编译器需要一个布尔/空对象。

您应该通过调试验证您在运行时传递的值,如有必要,将其复制到文本编辑器中进行彻底分析。

于 2018-10-15T14:27:13.873 回答
4

我遇到了类似的问题,现在它工作正常。问题可能是

data : {
        timesheetTO : JSON.stringify(timesheetTO)
    }

用双引号括起来

data : {
        ' "timesheetTO" : " '+JSON.stringify(timesheetTO)+' " '
    }
于 2017-03-02T07:35:51.680 回答
3

您需要验证您提供的 JSON 是否有效:错误消息表明情况并非如此。它还应该为您提供准确的行号和行号,您可以使用它们来查找输入 JSON 的问题。从消息中,我猜要么没有引用属性名称,要么没有引用某些字符串值。

于 2012-11-27T01:16:55.437 回答
0

ajax 数据应该采用 JSON 对象的字符串。在此处查看解决方案:

使用 jQuery 将 JSON 对象发布到 Spring 3 控制器

于 2017-02-24T03:40:10.950 回答
0

Alternatively, you can annotate your class with @RestController (if it is not already). Then you dont need to explicitly annotate your request and response with @RequestBody and @ResponseBody

So your method signature will change to

@PostMapping("/saveTimeBooking")
public ReturnTO saveTimeBooking(TimesheetTO timesheetTO[]) {
// ...
}
于 2019-08-09T18:43:43.953 回答