Spring Boot Ajax解析错误 - 无法将对象返回给ajax成功函数

3
我正在通过jQuery的ajax调用将一个值发送到我的Spring控制器。我希望它能够发送一个对象回来,以填充iziModal中的表单。目前,它会将值从浏览器发送回我的控制器,并在我的控制器方法中运行,但是我卡住了。由于某种原因,我在将响应发送回我的ajax成功函数时遇到问题。我得到了这个解析错误:JSON中意外的记号t,位置在1556482。

Here is my controller method:

 @RequestMapping(value="/editCarrierAjax", method= RequestMethod.POST)
 public @ResponseBody CarrierAppointment getCarrierDets (@RequestParam("data") String data, MasterCarrier masterCarrier,  Model model) throws Exception{
       CarrierAppointment carrierToEdit = carrierAppointmentRepository.findById(Long.parseLong(data));
        model.addAttribute("carrierToEdit", carrierToEdit);
        return carrierToEdit;
    }

Ajax调用:

            $('.trigger-edit-carrier').on('click', function(event){
                var selectId = $(this).attr('value');
                console.log(selectId);
                var token = $("meta[name='_csrf']").attr("content");
                console.log(token);
                var header = "X-CSRF-TOKEN";
                  console.log(header);
                 $.ajax({
                    type: "POST",
                    url: "/editCarrierAjax",
                    data: {data:selectId},
                    dataType:"json",
                    cache: false,
                    timeout: 600000,
                    beforeSend: function(xhr) {
                        xhr.setRequestHeader(header, token);
                        console.log(header +", "+ token);
                    },
                    success: function(data, jqXHR){
                          console.log("success fn");
                          console.log(data);
                      
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        alert("Status: " + textStatus); alert("Error: " + errorThrown);
                    }
                });
            });

我尝试添加了这里提到的Jackson库(将对象转换为Spring MVC中的JSON REST服务)

但仍然出现错误。有什么想法可以解决这个问题吗?


你的ajax代码没有 dataType: "json" 吗?你返回的是json响应吗? - Swati
@Swati 如果我将contentType和dataType设置为json,就会收到400错误的请求。我只是想返回一个对象。我之前在另一个项目中使用过类似的ajax/code,那里可以正常工作,所以不确定这里出了什么问题。 - Stacie
目前在你的代码中,你还没有将 carrierToEdit 转换为 JSON 格式,因为你的 AJAX 是接受 JSON 的。你能否更新你的代码?然后检查一下 console.log(data); 显示了什么? - Swati
2个回答

1
似乎你的方法返回的数据在解析JSON时出现了问题,有时是由于数据中存在某些特殊字符引起的。你能否尝试在服务器端记录carrierToEdit(System.out.println(carrierToEdit);),并查看其值?可能它将是非常大的字符串内容,如果你将它放入任何文本编辑器并转到位置1556482,你将看到导致此错误的t...
SyntaxError:JSON中的意外令牌t位于位置1556482
此外,如果你的数据不敏感,可以尝试使用一些JSON验证工具(如https://jsonlint.com/)在线验证它。
你可以在那里找到问题,并对数据/代码进行一些微小的更改来修复解析问题...

     @RequestMapping(value="/editCarrierAjax", method= RequestMethod.POST)
     public @ResponseBody CarrierAppointment getCarrierDets (@RequestParam("data") String data, MasterCarrier masterCarrier,  Model model) throws Exception{
           CarrierAppointment carrierToEdit = carrierAppointmentRepository.findById(Long.parseLong(data));
System.out.println(carrierToEdit);

            model.addAttribute("carrierToEdit", carrierToEdit);
            return carrierToEdit;
        }

希望这有所帮助...祝一切顺利 :)

0

如果您在jQuery代码中将contentType和dataType设置为json(可以尝试使用application/json!),则会返回400错误请求状态码,这可能与控制器配置不正确有关。如果您的所有控制器方法都处理JSON(在requestbody中接收JSON负载,在responsebody中响应JSON负载),那么您可以尝试在控制器类级别上设置@RestController注释 - 此注释还隐式添加了@ResponseBody注释,并配置所有控制器方法以消耗和生成类型为application/json的内容。例如:

@RestController
public class YourControllerClass {

  @PostMapping("/editCarrierAjax")
  public CarrierAppointment getCarrierDets(@RequestParam("data") String data, MasterCarrier masterCarrier,  Model model) throws Exception {
     CarrierAppointment carrierToEdit = carrierAppointmentRepository.findById(Long.parseLong(data));
     model.addAttribute("carrierToEdit", carrierToEdit);
     return carrierToEdit;
  }
}

另一个选择是明确配置此单个控制器方法,以消耗/生产JSON。例如,像这样:

@Controller
public class YourControllerClass {

  @ResponseBody 
  @RequestMapping(value="/editCarrierAjax", method= RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
  public CarrierAppointment getCarrierDets(@RequestParam("data") String data, MasterCarrier masterCarrier,  Model model) throws Exception{
    CarrierAppointment carrierToEdit = carrierAppointmentRepository.findById(Long.parseLong(data));
    model.addAttribute("carrierToEdit", carrierToEdit);
    return carrierToEdit;
  }
}

如果上述任何一种方法都无法解决您的问题,请分享您的整个控制器和CarrierAppointment类。 正如@Programmer建议的那样,您还应该验证发送回客户端的生成JSON。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接