diff --git a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java index d856ba9b0b2..baa521ab3ad 100755 --- a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java +++ b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java @@ -81,6 +81,7 @@ import org.flowable.common.engine.impl.cfg.standalone.StandaloneMybatisTransactionContextFactory; import org.flowable.common.engine.impl.db.CommonDbSchemaManager; import org.flowable.common.engine.impl.db.DbSqlSessionFactory; +import org.flowable.common.engine.impl.db.FlowableStringTypeHandler; import org.flowable.common.engine.impl.db.LogSqlExecutionTimePlugin; import org.flowable.common.engine.impl.db.MybatisTypeAliasConfigurator; import org.flowable.common.engine.impl.db.MybatisTypeHandlerConfigurator; @@ -948,8 +949,8 @@ public void initMybatisTypeHandlers(Configuration configuration) { // thus the same handler is used for both types. handlerRegistry.register(String.class, JdbcType.VARCHAR, new StringTypeHandler()); handlerRegistry.register(Object.class, JdbcType.VARCHAR, new StringTypeHandler()); - handlerRegistry.register(String.class, JdbcType.NVARCHAR, new StringTypeHandler()); // Notice: no 'N' prefix here - handlerRegistry.register(Object.class, JdbcType.NVARCHAR, new StringTypeHandler()); // Notice: no 'N' prefix here + handlerRegistry.register(String.class, JdbcType.NVARCHAR, new FlowableStringTypeHandler()); // Notice: no 'N' prefix here + handlerRegistry.register(Object.class, JdbcType.NVARCHAR, new FlowableStringTypeHandler()); // Notice: no 'N' prefix here } handlerRegistry.register(Object.class, JdbcType.LONGVARCHAR, new StringTypeHandler()); diff --git a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/db/FlowableStringTypeHandler.java b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/db/FlowableStringTypeHandler.java new file mode 100644 index 00000000000..c008a7d610b --- /dev/null +++ b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/db/FlowableStringTypeHandler.java @@ -0,0 +1,59 @@ +package org.flowable.common.engine.impl.db; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.TypeException; + +public class FlowableStringTypeHandler extends BaseTypeHandler { + + @Override + public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { + if (parameter == null) { + if (jdbcType == null) { + throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters."); + } + try { + ps.setNull(i, Types.NULL); + } catch (SQLException e) { + throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " + + "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " + + "Cause: " + e, e); + } + } else { + try { + setNonNullParameter(ps, i, parameter, jdbcType); + } catch (Exception e) { + throw new TypeException("Error setting non null for parameter #" + i + " with JdbcType " + jdbcType + " . " + + "Try setting a different JdbcType for this parameter or a different configuration property. " + "Cause: " + + e, e); + } + } + } + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) + throws SQLException { + ps.setString(i, parameter); + } + + @Override + public String getNullableResult(ResultSet rs, String columnName) throws SQLException { + return rs.getString(columnName); + } + + @Override + public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return rs.getString(columnIndex); + } + + @Override + public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return cs.getString(columnIndex); + } + }