fixed NPE in ArrayTypeHandler.setNonNullParameter

This commit is contained in:
开源海哥 2023-06-28 11:02:50 +08:00
parent 42c623b3e2
commit e4675c1047
3 changed files with 32 additions and 21 deletions

View File

@ -25,6 +25,7 @@ import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.type.TypeHandlerRegistry; import org.apache.ibatis.type.TypeHandlerRegistry;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -93,7 +94,7 @@ public class AuditManager {
} }
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql, Configuration configuration) throws SQLException { public static <T> T startAudit(AuditRunnable<T> supplier, Statement statement, BoundSql boundSql, Configuration configuration) throws SQLException {
AuditMessage auditMessage = messageFactory.create(); AuditMessage auditMessage = messageFactory.create();
if (auditMessage == null) { if (auditMessage == null) {
return supplier.execute(); return supplier.execute();
@ -118,12 +119,12 @@ public class AuditManager {
if (parameter instanceof Map) { if (parameter instanceof Map) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (((Map<?, ?>) parameter).containsKey(FlexConsts.SQL_ARGS)) { if (((Map<?, ?>) parameter).containsKey(FlexConsts.SQL_ARGS)) {
auditMessage.addParams(((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS)); auditMessage.addParams(statement, ((Map<?, ?>) parameter).get(FlexConsts.SQL_ARGS));
} else if (((Map<?, ?>) parameter).containsKey("collection")) { } else if (((Map<?, ?>) parameter).containsKey("collection")) {
Collection collection = (Collection) ((Map<?, ?>) parameter).get("collection"); Collection collection = (Collection) ((Map<?, ?>) parameter).get("collection");
auditMessage.addParams(collection.toArray()); auditMessage.addParams(statement, collection.toArray());
} else if (((Map<?, ?>) parameter).containsKey("array")) { } else if (((Map<?, ?>) parameter).containsKey("array")) {
auditMessage.addParams(((Map<?, ?>) parameter).get("array")); auditMessage.addParams(statement, ((Map<?, ?>) parameter).get("array"));
} else { } else {
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
for (ParameterMapping parameterMapping : parameterMappings) { for (ParameterMapping parameterMapping : parameterMappings) {
@ -138,7 +139,7 @@ public class AuditManager {
MetaObject metaObject = configuration.newMetaObject(parameter); MetaObject metaObject = configuration.newMetaObject(parameter);
value = metaObject.getValue(propertyName); value = metaObject.getValue(propertyName);
} }
auditMessage.addParams(value); auditMessage.addParams(statement, value);
} }
} }
} }

View File

@ -24,6 +24,7 @@ import java.lang.reflect.Array;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -171,38 +172,47 @@ public class AuditMessage implements Serializable {
this.queryParams = queryParams; this.queryParams = queryParams;
} }
public void addParams(Object... objects) { public void addParams(Statement statement, Object... objects) {
if (queryParams == null) { if (queryParams == null) {
queryParams = new ArrayList<>(); queryParams = new ArrayList<>();
} }
for (Object object : objects) { for (Object object : objects) {
if (object != null && ClassUtil.isArray(object.getClass())) { if (object != null && ClassUtil.isArray(object.getClass())) {
for (int i = 0; i < Array.getLength(object); i++) { for (int i = 0; i < Array.getLength(object); i++) {
addParams(Array.get(object, i)); doAddParam(statement, Array.get(object, i));
}
} else if (object instanceof TypeHandlerObject) {
try {
((TypeHandlerObject) object).setParameter(createPreparedStatement(), 0);
} catch (SQLException e) {
//ignore
} }
} else { } else {
queryParams.add(object); doAddParam(statement, object);
} }
} }
} }
private void doAddParam(Statement statement, Object object) {
if (object instanceof TypeHandlerObject) {
try {
((TypeHandlerObject) object).setParameter(createPreparedStatement(statement), 0);
} catch (SQLException e) {
//ignore
}
} else {
queryParams.add(object);
}
}
public String getFullSql() { public String getFullSql() {
List<Object> queryParams = getQueryParams(); List<Object> queryParams = getQueryParams();
return SqlUtil.replaceSqlParams(getQuery(), queryParams == null ? null : queryParams.toArray()); return SqlUtil.replaceSqlParams(getQuery(), queryParams == null ? null : queryParams.toArray());
} }
private PreparedStatement createPreparedStatement() { private PreparedStatement createPreparedStatement(Statement statement) {
return (PreparedStatement) Proxy.newProxyInstance( return (PreparedStatement) Proxy.newProxyInstance(
AuditMessage.class.getClassLoader(), AuditMessage.class.getClassLoader(),
new Class[]{PreparedStatement.class}, (proxy, method, args) -> { new Class[]{PreparedStatement.class}, (proxy, method, args) -> {
if (args != null && args.length == 2) { if (args != null && (args.length == 2 || args.length == 3)) {
addParams(args[1]); doAddParam(statement, args[1]);
} else if ("getConnection".equals(method.getName())) {
return statement.getConnection();
} }
return null; return null;
}); });

View File

@ -83,7 +83,7 @@ public class FlexStatementHandler implements StatementHandler {
AuditManager.startAudit(() -> { AuditManager.startAudit(() -> {
delegate.batch(statement); delegate.batch(statement);
return null; return null;
}, boundSql, configuration); }, statement, boundSql, configuration);
} else { } else {
delegate.batch(statement); delegate.batch(statement);
} }
@ -91,19 +91,19 @@ public class FlexStatementHandler implements StatementHandler {
@Override @Override
public int update(Statement statement) throws SQLException { public int update(Statement statement) throws SQLException {
return auditEnable ? AuditManager.startAudit(() -> delegate.update(statement), boundSql,configuration) return auditEnable ? AuditManager.startAudit(() -> delegate.update(statement), statement, boundSql, configuration)
: delegate.update(statement); : delegate.update(statement);
} }
@Override @Override
public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException { public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
return auditEnable ? AuditManager.startAudit(() -> delegate.query(statement, resultHandler), boundSql, configuration) return auditEnable ? AuditManager.startAudit(() -> delegate.query(statement, resultHandler), statement, boundSql, configuration)
: delegate.query(statement, resultHandler); : delegate.query(statement, resultHandler);
} }
@Override @Override
public <E> Cursor<E> queryCursor(Statement statement) throws SQLException { public <E> Cursor<E> queryCursor(Statement statement) throws SQLException {
return auditEnable ? AuditManager.startAudit(() -> delegate.queryCursor(statement), boundSql, configuration) return auditEnable ? AuditManager.startAudit(() -> delegate.queryCursor(statement), statement, boundSql, configuration)
: delegate.queryCursor(statement); : delegate.queryCursor(statement);
} }