春季批处理数据库中步进执行中的MBCS数据

时间:2019-06-14 13:53:44

标签: character-encoding spring-batch

我正在将Spring Batch与Jdbc和Postgres DB一起使用。所有作业和步骤执行数据都保存在PostgreS DB中的spring批创建表中。

我正在使用它保存一些步骤上下文数据,这些数据保存在SERIALIZED_CONTEXT列的batch_step_execution_context表中。 我保存的数据有一些MBCS字符。

但是我看到将数据写入表并使用ISO-8859-1字符集从表中读取数据时看到了。 因此,尽管我的mbcs字符通过Xstream默认序列化程序进行了序列化,但被存储为垃圾。

任何解决此问题的方法,因此我可以检索数据并将其另存为MBCS。

请从JDBCExecutionContextDao中找到代码段。

private String serializeContext(ExecutionContext ctx) {
        Map<String, Object> m = new HashMap<String, Object>();
        for (Entry<String, Object> me : ctx.entrySet()) {
            m.put(me.getKey(), me.getValue());
        }

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        String results = "";

        try {
            serializer.serialize(m, out);
            results = new String(out.toByteArray(), "ISO-8859-1");
        }
        catch (IOException ioe) {
            throw new IllegalArgumentException("Could not serialize the execution context", ioe);
        }

        return results;
    }

    private class ExecutionContextRowMapper implements RowMapper<ExecutionContext> {

        @Override
        public ExecutionContext mapRow(ResultSet rs, int i) throws SQLException {
            ExecutionContext executionContext = new ExecutionContext();
            String serializedContext = rs.getString("SERIALIZED_CONTEXT");
            if (serializedContext == null) {
                serializedContext = rs.getString("SHORT_CONTEXT");
            }

            Map<String, Object> map;
            try {
                ByteArrayInputStream in = new ByteArrayInputStream(serializedContext.getBytes("ISO-8859-1"));
                map = serializer.deserialize(in);
            }
            catch (IOException ioe) {
                throw new IllegalArgumentException("Unable to deserialize the execution context", ioe);
            }
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                executionContext.put(entry.getKey(), entry.getValue());
            }
            return executionContext;
        }
    }

我希望存储和检索mbcs数据。

1 个答案:

答案 0 :(得分:0)

  

尽管我的mbcs字符通过Xstream默认序列化程序进行了序列化,但仍被存储为垃圾。

不推荐使用XStreamExecutionContextStringSerializer,建议改用Jackson2ExecutionContextStringSerializer

也就是说,如果要对执行上下文的数据使用多字节字符,则需要增加元数据模式中列的大小。参考文档的International and Multi-byte Characters部分对此进行了说明。