Ajax调用控制器端点时Jackson抛出JsonParseException异常
解决Jackson解析时的JsonParseException(base64字符串截断)问题
这个错误我之前在处理文件转base64的请求时也碰到过,核心原因就是Jackson在解析base64格式字符串时,发现内容不完整或者不符合规范,直接抛出了Unexpected end-of-String异常。下面给你几个排查和解决的思路:
1. 检查前端生成/传输的base64字符串是否完整规范
base64编码有个硬性要求:字符串长度必须是4的倍数,不足的部分需要用=补位。如果前端生成的base64字符串缺少补位字符,或者传输过程中被截断(比如大文件导致请求体被截断),Jackson就会触发这个错误。
你可以在前端发送请求前,先对base64字符串做校验和补全:
function fixBase64Padding(base64Str) { // 去掉可能的data URI前缀(比如data:image/png;base64,) const pureBase64 = base64Str.split(',')[1] || base64Str; // 补全到4的倍数 while (pureBase64.length % 4 !== 0) { pureBase64 += '='; } return pureBase64; }
2. 确保Ajax请求的Content-Type设置正确
如果你的请求是JSON格式,一定要在Ajax里明确设置contentType: "application/json; charset=utf-8",否则后端可能无法正确解析请求体,导致Jackson拿到的内容是乱码或不完整片段。
示例Ajax请求:
$.ajax({ url: '/your-controller-endpoint', method: 'POST', contentType: 'application/json; charset=utf-8', // 关键设置 data: JSON.stringify({ node: { // 你的node对象字段,比如base64Content: fixBase64Padding(yourBase64String) } }), success: function(res) { // 处理响应 } });
3. 后端调试确认接收的请求体是否完整
你可以在控制器方法里先打印整个请求体,看看实际接收到的base64字符串和前端发送的是否一致:
@RequestMapping(value = "/your-endpoint", method = RequestMethod.POST) public ResponseEntity<?> handleRequest(HttpServletRequest request) throws IOException { // 读取整个请求体 String requestBody = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); System.out.println("Received request body: " + requestBody); // 后续的Jackson解析逻辑 return ResponseEntity.ok().build(); }
如果打印的内容里base64字符串确实被截断,就要排查前端传输或服务器配置问题(比如服务器是否限制了请求体大小)。
4. 确认后端实体类的字段类型匹配
如果你的Node类里对应base64的字段是byte[]类型,Jackson会自动尝试把base64字符串解码成字节数组,但格式不对就会报错。如果不需要自动解码,也可以把字段改成String类型,自己处理解码逻辑,这样能更灵活地排查问题。
示例实体类:
public class Node { // 其他字段 private String base64Content; // 用String接收,后续自己解码 // 或者用byte[]让Jackson自动解码 // private byte[] base64Content; // getter和setter方法 }
按照上面的步骤排查,基本就能解决这个base64解析的EOF异常了。
内容的提问来源于stack exchange,提问作者Uriel Arvizu
相关产品推荐
相关产品推荐

