首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring batch数据库中分步执行的MBCS数据

spring batch数据库中分步执行的MBCS数据
EN

Stack Overflow用户
提问于 2019-06-14 21:53:45
回答 1查看 159关注 0票数 0

我将spring batch与Jdbc和Postgres DB结合使用。所有作业和步骤执行数据都保存在PostgreS DB中的spring batch created表中。

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

但是我发现,在向表中写入数据和从表中读取数据时,都使用ISO-8859-1字符集。因此,尽管我的mbcs字符是由Xstream序列化的,但是默认的序列化程序被存储为垃圾。

任何方法都可以解决这个问题,这样我就可以检索数据并将其保存为MBCS。

请找到JDBCExecutionContextDao中的代码片段。

代码语言:javascript
复制
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数据。

EN

回答 1

Stack Overflow用户

发布于 2019-06-14 22:26:12

因此,我的mbcs字符虽然由

序列化,但默认的序列化程序被存储为垃圾。

XStreamExecutionContextStringSerializer已弃用,我们建议您改用Jackson2ExecutionContextStringSerializer

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56599638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档