fix: #17 全局监听器父类注册是接口时无法触发监听器

This commit is contained in:
snow 2023-04-28 16:08:51 +08:00
parent f636bb53d1
commit 29cf1945be
7 changed files with 129 additions and 21 deletions

View File

@ -16,10 +16,10 @@
package com.mybatisflex.core;
import com.mybatisflex.annotation.InsertListener;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.SetListener;
import com.mybatisflex.annotation.UpdateListener;
import com.mybatisflex.core.dialect.DbType;
import com.mybatisflex.annotation.KeyType;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
@ -162,11 +162,42 @@ public class FlexGlobalConfig {
return entityUpdateListeners.get(entityClass);
}
/**
* 获取支持该 {@code entityClass} 的update监听器
* <p>当registerClass是entityClass的本身或其超类时则视为支持</p>
*
* @param entityClass 实体class
* @return UpdateListener
*/
public UpdateListener getSupportedUpdateListener(Class<?> entityClass) {
for (Class<?> registerClass : entityUpdateListeners.keySet()) {
if (registerClass.isAssignableFrom(entityClass)) {
return entityUpdateListeners.get(registerClass);
}
}
return null;
}
public InsertListener getInsertListener(Class<?> entityClass) {
return entityInsertListeners.get(entityClass);
}
/**
* 获取支持该 {@code entityClass} 的insert监听器
* <p>当registerClass是entityClass的本身或其超类时则视为支持</p>
*
* @param entityClass 实体class
* @return InsertListener
*/
public InsertListener getSupportedInsertListener(Class<?> entityClass) {
for (Class<?> registerClass : entityInsertListeners.keySet()) {
if (registerClass.isAssignableFrom(entityClass)) {
return entityInsertListeners.get(registerClass);
}
}
return null;
}
public Object getNormalValueOfLogicDelete() {
return normalValueOfLogicDelete;

View File

@ -778,15 +778,7 @@ public class TableInfo {
return;
}
InsertListener globalInsertListener = null;
Class<?> registerClass = entityClass;
while (globalInsertListener == null && registerClass != Object.class && registerClass != null) {
globalInsertListener = FlexGlobalConfig.getDefaultConfig().getInsertListener(registerClass);
registerClass = registerClass.getSuperclass();
}
InsertListener globalInsertListener = FlexGlobalConfig.getDefaultConfig().getSupportedInsertListener(entityClass);
if (globalInsertListener != null) {
globalInsertListener.onInsert(entity);
}
@ -799,14 +791,7 @@ public class TableInfo {
return;
}
UpdateListener globalUpdateListener = null;
Class<?> registerClass = entityClass;
while (globalUpdateListener == null && registerClass != Object.class && registerClass != null) {
globalUpdateListener = FlexGlobalConfig.getDefaultConfig().getUpdateListener(registerClass);
registerClass = registerClass.getSuperclass();
}
UpdateListener globalUpdateListener = FlexGlobalConfig.getDefaultConfig().getSupportedUpdateListener(entityClass);
if (globalUpdateListener != null) {
globalUpdateListener.onUpdate(entity);
}

View File

@ -93,6 +93,12 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.22.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -10,8 +10,8 @@ import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Table(value = "tb_account",dataSource = "ds2",onSet = AccountOnSetListener.class)
public class Account extends BaseAccount implements Serializable {
@Table(value = "tb_account", dataSource = "ds2", onSet = AccountOnSetListener.class)
public class Account extends BaseAccount implements Serializable, AgeAware {
private static final long serialVersionUID = 1L;
@ -26,7 +26,7 @@ public class Account extends BaseAccount implements Serializable {
@NotBlank
private Date birthday;
@Column(typeHandler = Fastjson2TypeHandler.class,isLarge = true)
@Column(typeHandler = Fastjson2TypeHandler.class, isLarge = true)
private Map<String, Object> options;
@Column(isLogicDelete = true)
@ -49,10 +49,12 @@ public class Account extends BaseAccount implements Serializable {
this.userName = userName;
}
@Override
public int getAge() {
return age;
}
@Override
public void setAge(int age) {
this.age = age;
}

View File

@ -0,0 +1,14 @@
package com.mybatisflex.test;
/**
* 有年龄的
*
* @author snow
* @since 2023/4/28
*/
public interface AgeAware {
void setAge(int age);
int getAge();
}

View File

@ -0,0 +1,23 @@
package com.mybatisflex.test;
import com.mybatisflex.annotation.InsertListener;
/**
* 年龄处理监听器
*
* @author snow
* @since 2023/4/28
*/
public class AgeHandleListener implements InsertListener {
@Override
public void onInsert(Object entity) {
if (entity instanceof AgeAware) {
AgeAware ageAware = (AgeAware) entity;
int age = ageAware.getAge();
if (age < 0) {
ageAware.setAge(0);
}
}
}
}

View File

@ -0,0 +1,47 @@
package com.mybatisflex.test;
import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.MybatisFlexBootstrap;
import org.assertj.core.api.WithAssertions;
import org.junit.Test;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource;
import java.util.Date;
/**
* 监听器测试
*
* @author snow
* @since 2023/4/28
*/
public class ListenerTest implements WithAssertions {
// 注册父类接口监听器
@Test
public void onInsertInterface() throws Exception {
DataSource dataSource = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql")
.build();
// 注册全局监听器
FlexGlobalConfig defaultConfig = FlexGlobalConfig.getDefaultConfig();
defaultConfig.registerInsertListener(new AgeHandleListener(), AgeAware.class);
MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance()
.setDataSource(dataSource)
.addMapper(AccountMapper.class)
.start();
AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class);
Account account = new Account();
account.setAge(-2);
account.setUserName("on insert");
account.setBirthday(new Date());
accountMapper.insert(account);
Account one = accountMapper.selectOneById(account.getId());
assertThat(one.getAge()).isEqualTo(0);
}
}