Skip to content

Commit e73b83c

Browse files
committed
@ReturnGeneratedKeys增加DAO返回类型判断
1 parent 6ca347c commit e73b83c

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

paoding-rose-jade/src/main/java/net/paoding/rose/jade/annotation/ReturnGeneratedKeys.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
Class<? extends DynamicReturnGeneratedKeys>value() default Yes.class;
5151

52-
static class Yes implements DynamicReturnGeneratedKeys {
52+
static class Yes extends DynamicReturnGeneratedKeys {
5353

5454
@Override
5555
public boolean shouldReturnGerneratedKeys(StatementRuntime runtime) {

paoding-rose-jade/src/main/java/net/paoding/rose/jade/statement/DynamicReturnGeneratedKeys.java

+19-2
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,34 @@
1515
*/
1616
package net.paoding.rose.jade.statement;
1717

18+
import org.springframework.dao.InvalidDataAccessApiUsageException;
19+
1820
import net.paoding.rose.jade.annotation.ReturnGeneratedKeys;
1921

2022
/**
2123
*
2224
* @see ReturnGeneratedKeys
2325
*/
24-
public interface DynamicReturnGeneratedKeys {
26+
public abstract class DynamicReturnGeneratedKeys {
2527

2628
/**
2729
* 是否要启动 return generated keys机制
2830
* @param runtime
2931
*/
30-
public boolean shouldReturnGerneratedKeys(StatementRuntime runtime);
32+
public abstract boolean shouldReturnGerneratedKeys(StatementRuntime runtime);
33+
34+
/**
35+
* 检查DAO返回的类型是否合格
36+
*
37+
* @param returnType DAO方法的返回类型(如果方法声明的返回类型是泛型,框架会根据上下文信息解析为运行时实际应该返回的真正类型)
38+
*
39+
* @throws InvalidDataAccessApiUsageException DAO方法的返回类型不合格
40+
*/
41+
public void checkMethodReturnType(Class<?> returnType, StatementMetaData metaData) {
42+
if (returnType != void.class && !Number.class.isAssignableFrom(returnType)) {
43+
throw new InvalidDataAccessApiUsageException(
44+
"error return type, only support int/long/double/float/void type for method with @ReturnGeneratedKeys:"
45+
+ metaData.getMethod());
46+
}
47+
}
3148
}

paoding-rose-jade/src/main/java/net/paoding/rose/jade/statement/JdbcStatement.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public JdbcStatement(StatementMetaData statementMetaData, SQLType sqlType,
9494
if (types.length > 0 && List.class.isAssignableFrom(types[0])) {
9595
this.batchUpdate = true;
9696
if (metaData.getMethod().getAnnotation(ReturnGeneratedKeys.class) != null) {
97+
// 批量处理的直接不支持@ReturnGeneratedKeys注解
9798
throw new InvalidDataAccessApiUsageException(
9899
"batch update method cannot return generated keys: " + method);
99100
}
@@ -106,11 +107,8 @@ public JdbcStatement(StatementMetaData statementMetaData, SQLType sqlType,
106107
} else {
107108
this.batchUpdate = false;
108109
if (metaData.getMethod().getAnnotation(ReturnGeneratedKeys.class) != null) {
109-
if (returnType != void.class && !Number.class.isAssignableFrom(returnType)) {
110-
throw new InvalidDataAccessApiUsageException(
111-
"error return type, only support numberic/void type for method with @ReturnGeneratedKeys:"
112-
+ method);
113-
}
110+
metaData.getReturnGeneratedKeys().checkMethodReturnType(metaData.getReturnType(),
111+
metaData);
114112
} else if (returnType != void.class && returnType != Boolean.class
115113
&& returnType != Integer.class) {
116114
throw new InvalidDataAccessApiUsageException(

0 commit comments

Comments
 (0)