Java 为什么会发生JsonParseException呢?

Java 为什么会发生JsonParseException呢?,java,spring,spring-integration,Java,Spring,Spring Integration,消息是在队列通道尝试发送到特定IP时发出的。 适配器是 @Bean public AbstractConnectionFactory plainClientFactory() { int port = Integer.parseInt(outboundPort); TcpNioClientConnectionFactory factory = new TcpNioClientConnectionFactory(outboundHost, port); factory.se

消息是在队列通道尝试发送到特定IP时发出的。

适配器是

@Bean
public AbstractConnectionFactory plainClientFactory() {
    int port = Integer.parseInt(outboundPort);
    TcpNioClientConnectionFactory factory = new TcpNioClientConnectionFactory(outboundHost, port);
    factory.setTaskExecutor(taskSchedulerWithPlain());
    factory.setLookupHost(false);

    factory.setSerializer(echoSerializer);
    factory.setDeserializer(echoSerializer);

    // Nagle's algorithm disabled
    factory.setSoTcpNoDelay(true);

    return factory;
}

@Bean
public TcpSendingMessageHandler plainClientHandler() {
    TcpSendingMessageHandler handler = new TcpSendingMessageHandler();
    handler.setConnectionFactory(plainClientFactory());

    return handler;
}

@Bean
public Executor taskSchedulerWithPlain() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(PROCESS_SIZE);
    scheduler.setThreadFactory(plainAffinityThreadFactory());
    scheduler.setWaitForTasksToCompleteOnShutdown(true);

    return scheduler;
}
配置是

@Resource(name = "sslClientHandler")
TcpSendingMessageHandler sslClientHandler;

@Bean
public IntegrationFlow flowForConvertingSslJsonToBytesAndSendClient() {
    return IntegrationFlows.from(outputWithSslJsonBytesToClient())
            .transform(new ObjectToJsonTransformer())
            .transform(new PayloadSerializingTransformer())
            .handle(INBOUND_SERVICE, ATTACH_HEADER).handle(sslClientHandler).get();
}

@Bean
public MessageChannel outputWithSslJsonBytesToClient() {
    return MessageChannels.queue(POOL_SIZE).get();
}
InboundServiceImpl是

@Override
public Object extractPayloadAsJson(byte[] message) throws Exception {
    log.debug("receive bytes... {} bytes", message.length);

    StringBuffer sb = new StringBuffer();
    for (byte b : message) {
        sb.append(b);
    }

    log.debug("extractPayloadAsJson message to string : {}", sb.toString());

    int payloadSize = message.length - EXPECTED_HEADER_SIZE;

    byte[] payload = new byte[payloadSize];
    byte[] header = new byte[EXPECTED_HEADER_SIZE];

    System.arraycopy(message, EXPECTED_HEADER_SIZE, payload, 0, payloadSize);
    log.debug("extract json... {} bytes", payload.length);

    System.arraycopy(message, 0, header, 0, EXPECTED_HEADER_SIZE);

    ObjectMapper mapper = new ObjectMapper();

    HashMap<String, Object> payloadAsMap = mapper.readValue(payload, HashMap.class);
    log.debug("convert map... {}", payloadAsMap.entrySet());

    return payloadAsMap;
}


@Override
public byte[] attachHeader(byte[] payload) throws Exception {
    byte[] jsonFlag = ByteBuffer.allocate(HEADER_SIZE_JSON).putShort((short) 0).array();
    byte[] crcWithoutJsonFlag = new byte[HEADER_SIZE_CRC_WITHOUT_JSON_FLAG];
    byte[] rcmd = new byte[HEADER_SIZE_RCMD];
    byte[] packetSize = ByteBuffer.allocate(HEADER_PACKET_SIZE).putInt(payload.length).array();

    byte[] concat = Bytes.concat(jsonFlag, crcWithoutJsonFlag, rcmd, packetSize, payload);

    log.debug("concat {} bytes", concat.length);

    StringBuffer sb = new StringBuffer();
    for (byte b : concat) {
        sb.append(b);
    }

    log.debug("concat to string : {}", sb.toString());

    return concat;
}

JSON数据是

{"result":"success","reason":0,"pushTargetList":["dhjung","hiryu","hjoh","hslee","hslee1","jhbae","jslee1","khhwang","permedia","test_uid","wjchoi1","ysahn"],"response":"pushTarget"}
标题是

{json__ContentTypeId__=class java.lang.String, json__TypeId__=class java.util.HashMap, ip_tcp_remotePort=61036, ip_connectionId=192.168.3.96:61036:5001:e43b15c1-14b8-4694-b7ff-3bd8d5bb9379, ip_address=192.168.3.96, id=ad405ee4-f858-d7f0-ba7d-8a7ae25cc8a5, json__KeyTypeId__=class java.lang.String, contentType=application/json, ip_hostname=192.168.3.96, timestamp=1466476432549}

在将负载转换为JSON之后,为什么要对其应用java序列化

.transform(new PayloadSerializingTransformer()) 
…解码时,您没有执行相反的操作

172是
0xac
——它是java序列化对象的第一个“魔法”头字节


还有,为什么要进行所有的头操作,如果您将有效负载转换为包含头的列表,JSON(反)序列化也会处理头。

为什么在将有效负载转换为JSON后要对其应用java序列化

.transform(new PayloadSerializingTransformer()) 
…解码时,您没有执行相反的操作

172是
0xac
——它是java序列化对象的第一个“魔法”头字节


还有,为什么要进行所有的头操作呢?如果将有效负载转换为包含头的列表,JSON(反)序列化也会处理头。

要解析的JSON是什么?所有配置在这里都没有意义。您应该共享您的InboundServiceImpl,因为usIt的堆栈跟踪点已更新。错误中提到了意外的“?”字符,显然您包含的不是已解析的JSON。您要解析的JSON是什么?所有配置在这里都没有意义。您应该共享您的InboundServiceImpl,因为usIt的堆栈跟踪点已经更新。错误中提到了意外的“?”字符,显然您包含的不是解析的JSON。这是因为JSON数据返回必须转换为字节数组
attachHeader()
方法正在将一个12字节的值放在有效负载之前进行标识。
新的PayloadSerializengTransformer()
是否出现问题?是;一个大问题是
字符串的java序列化将元数据添加到
字节[]
;您需要在消费者端进行反序列化。将方法更改为
public byte[]attachHeader(字符串有效负载)
-然后使用
payload.getBytes()
转换为
字节[]
。如果使用非ascii字符,请使用字符集,例如
payload.getBytes(“UTF-8”)
。这是因为json数据返回必须转换为字节数组
attachHeader()
方法正在将一个12字节的值放在有效负载之前进行标识。
新的PayloadSerializengTransformer()
是否出现问题?是;一个大问题是
字符串的java序列化将元数据添加到
字节[]
;您需要在消费者端进行反序列化。将方法更改为
public byte[]attachHeader(字符串有效负载)
-然后使用
payload.getBytes()
转换为
字节[]
。如果使用非ascii字符,请使用字符集,例如
payload.getBytes(“UTF-8”)
.transform(new PayloadSerializingTransformer())