xuxueli / xxl-job

A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
http://www.xuxueli.com/xxl-job/
GNU General Public License v3.0
27.57k stars 10.91k forks source link

json解析问题 #1324

Closed etertal closed 4 years ago

etertal commented 4 years ago

Please answer some questions before submitting your issue. Thanks!

Which version of XXL-JOB do you using?

2.1.1-Release https://github.com/xuxueli/xxl-job/releases/tag/2.1.1 有人遇到下面这个问题吗: Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('d' (code 100)): was n�o�","msg":"ok","success":true}","content":null}}]; line: 1, column: 81]t [Source: [{"logId":2963,"logDateTim":1575126000005,"executeResult":{"code":200,"msg":"{"data":"�� at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702) at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558) at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:456) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipComma(ReaderBasedJsonParser.java:2285) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextFieldName(ReaderBasedJsonParser.java:912) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:283) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504) at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:104) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) ... 73 common frames omitted 2019-12-02 15:42:30,207 ERROR [http-nio-9000-exec-5] c.x.job.admin.core.util.JacksonUtil [JacksonUtil.java : 86] Unexpected character ('d' (code 100)): was expecting comma to separate Object entries n�o�","msg":"ok","success":true}","content":null}}]; line: 1, column: 81]t [Source: [{"logId":2963,"logDateTim":1575126000005,"executeResult":{"code":200,"msg":"{"data":"��n�o�","msg":"ok","success":true}","content":null}}]; line: 1, column: 77] (through reference chain: java.util.ArrayList[0]->com.xxl.job.core.biz.model.HandleCallbackParam["executeResult"]) com.fasterxml.jackson.databind.JsonMappingException: Unexpected character ('d' (code 100)): was expecn�o�","msg":"ok","success":true}","content":null}}]; line: 1, column: 81]t [Source: [{"logId":2963,"logDateTim":1575126000005,"executeResult":{"code":200,"msg":"{"data":"��n�o�","msg":"ok","success":true}","content":null}}]; line: 1, column: 77] (through reference chain: java.util.ArrayList[0]->com.xxl.job.core.biz.model.HandleCallbackParam["executeResult"]) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:388) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:348) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1611) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:278) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:287) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:259) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2896) at com.xxl.job.admin.core.util.JacksonUtil.readValue(JacksonUtil.java:82) at com.xxl.job.admin.controller.JobApiController.callback(JobApiController.java:53)

etertal commented 4 years ago

我还原了一把现场: ` public class DemoJobHandler extends IJobHandler {

@Override
public ReturnT<String> execute(String param) throws Exception {
    XxlJobLogger.log("XXL-JOB, Hello World.");

    for (int i = 0; i < 5; i++) {
        XxlJobLogger.log("beat at:" + i);
        TimeUnit.SECONDS.sleep(2);
    }

    ResultVO<String> resultVO =  new ResultVO<>();
    resultVO.success("deleteCreateAdPlan execute end!");
    ReturnT<String> result = new ReturnT<>(ReturnT.SUCCESS_CODE, JSON.toJSONString(resultVO));
    return result;
}

} ` ReturnT中msg属性如果是一个复杂的JSON串,回调的时候组装json会出问题!导致回调到admin会报解析异常的错误! com.xxl.registry.client.util.json.BasicJsonwriter,这个类中的toJson组装过程有点小问题!

public String toJson(Object object) { StringBuilder json = new StringBuilder(); try { this.writeObjItem((String)null, object, json); } catch (Exception var4) { logger.error(var4.getMessage(), var4); } String str = json.toString(); if (str.contains("\n")) { str = str.replaceAll("\\n", "\\\\n"); } if (str.contains("\t")) { str = str.replaceAll("\\t", "\\\\t"); } if (str.contains("\r")) { str = str.replaceAll("\\r", "\\\\r"); } return str; }

Mu-L commented 4 years ago

遇到类似问题,使用xxl-job-simple-springboot中的httpJobHandler修改,将Http请求的responseMessage(json格式)存入ReturnT的msg中,admin回调接口错误,无法将返回结果存入数据库。

dong4j commented 4 years ago

我遇到类似的问题是: 自定义异常中存在中文, client 调用 /callback 接口发送数据时, 中文被错误的编码了, 在 admin 端接收到的数据就是乱码, 然后再转 json 时出现了异常, 而且只要这个错误不解决, 删除 callback 目录下的二进制文件就可以了.

zhipingwu commented 4 years ago

针对这个问题,我刚刚改了一波代码,自测通过,pull request已经提交。

xuxueli commented 4 years ago

问题已修复,可以参考 @zhipingwu 同学的PR:https://github.com/xuxueli/xxl-job/pull/1345

可以自行调整相关代码,或者等待即将发布下个小版本。