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 java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@ -93,7 +94,7 @@ public class AuditManager {
}
@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();
if (auditMessage == null) {
return supplier.execute();
@ -118,12 +119,12 @@ public class AuditManager {
if (parameter instanceof Map) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
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")) {
Collection collection = (Collection) ((Map<?, ?>) parameter).get("collection");
auditMessage.addParams(collection.toArray());
auditMessage.addParams(statement, collection.toArray());
} else if (((Map<?, ?>) parameter).containsKey("array")) {
auditMessage.addParams(((Map<?, ?>) parameter).get("array"));
auditMessage.addParams(statement, ((Map<?, ?>) parameter).get("array"));
} else {
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
for (ParameterMapping parameterMapping : parameterMappings) {
@ -138,7 +139,7 @@ public class AuditManager {
MetaObject metaObject = configuration.newMetaObject(parameter);
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.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -171,38 +172,47 @@ public class AuditMessage implements Serializable {
this.queryParams = queryParams;
}
public void addParams(Object... objects) {
public void addParams(Statement statement, Object... objects) {
if (queryParams == null) {
queryParams = new ArrayList<>();
}
for (Object object : objects) {
if (object != null && ClassUtil.isArray(object.getClass())) {
for (int i = 0; i < Array.getLength(object); i++) {
addParams(Array.get(object, i));
}
} else if (object instanceof TypeHandlerObject) {
try {
((TypeHandlerObject) object).setParameter(createPreparedStatement(), 0);
} catch (SQLException e) {
//ignore
doAddParam(statement, Array.get(object, i));
}
} 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() {
List<Object> queryParams = getQueryParams();
return SqlUtil.replaceSqlParams(getQuery(), queryParams == null ? null : queryParams.toArray());
}
private PreparedStatement createPreparedStatement() {
private PreparedStatement createPreparedStatement(Statement statement) {
return (PreparedStatement) Proxy.newProxyInstance(
AuditMessage.class.getClassLoader(),
new Class[]{PreparedStatement.class}, (proxy, method, args) -> {
if (args != null && args.length == 2) {
addParams(args[1]);
if (args != null && (args.length == 2 || args.length == 3)) {
doAddParam(statement, args[1]);
} else if ("getConnection".equals(method.getName())) {
return statement.getConnection();
}
return null;
});

View File

@ -83,7 +83,7 @@ public class FlexStatementHandler implements StatementHandler {
AuditManager.startAudit(() -> {
delegate.batch(statement);
return null;
}, boundSql, configuration);
}, statement, boundSql, configuration);
} else {
delegate.batch(statement);
}
@ -91,19 +91,19 @@ public class FlexStatementHandler implements StatementHandler {
@Override
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);
}
@Override
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);
}
@Override
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);
}