我正在将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数据。
答案 0 :(得分:0)
尽管我的mbcs字符通过Xstream默认序列化程序进行了序列化,但仍被存储为垃圾。
不推荐使用XStreamExecutionContextStringSerializer
,建议改用Jackson2ExecutionContextStringSerializer
。
也就是说,如果要对执行上下文的数据使用多字节字符,则需要增加元数据模式中列的大小。参考文档的International and Multi-byte Characters部分对此进行了说明。