Commit 310a436c124869617e8de77e43b6a73b1c73a597

Authored by timfruit
1 parent ee75b2e2

完成menu单测

src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
... ... @@ -168,10 +168,6 @@ public class SysMenuServiceImpl implements SysMenuService {
168 168 */
169 169 @Transactional(rollbackFor = Exception.class)
170 170 public void deleteMenu(Long menuId) {
171   - // 校验更新的菜单是否存在
172   - if (menuMapper.selectById(menuId) == null) {
173   - throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS);
174   - }
175 171 // 校验是否还有子菜单
176 172 if (menuMapper.selectCountByParentId(menuId) > 0) {
177 173 throw ServiceExceptionUtil.exception(MENU_EXISTS_CHILDREN);
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java
1 1 package cn.iocoder.dashboard.modules.system.service.permission;
2 2  
  3 +import cn.hutool.core.bean.BeanUtil;
  4 +import cn.hutool.core.lang.Assert;
3 5 import cn.iocoder.dashboard.BaseDbUnitTest;
4 6 import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO;
5 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO;
6 10 import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysMenuMapper;
7 11 import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
8 12 import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer;
9   -import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysPermissionProducer;
10 13 import cn.iocoder.dashboard.modules.system.service.permission.impl.SysMenuServiceImpl;
  14 +import cn.iocoder.dashboard.util.AopTargetUtils;
11 15 import cn.iocoder.dashboard.util.AssertUtils;
12 16 import cn.iocoder.dashboard.util.RandomUtils;
  17 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  18 +import com.google.common.collect.Multimap;
13 19 import org.junit.jupiter.api.Assertions;
14 20 import org.junit.jupiter.api.Test;
15   -import org.springframework.beans.factory.annotation.Autowired;
16 21 import org.springframework.boot.test.mock.mockito.MockBean;
17 22 import org.springframework.context.annotation.Import;
18 23  
19 24 import javax.annotation.Resource;
20 25  
21   -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.MENU_PARENT_NOT_DIR_OR_MENU;
22   -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.MENU_PARENT_NOT_EXISTS;
23   -import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
  26 +import java.util.*;
  27 +
  28 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
24 29 import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
  30 +import static org.junit.jupiter.api.Assertions.assertEquals;
25 31 import static org.mockito.Mockito.verify;
26 32  
27 33 @Import(SysMenuServiceImpl.class)
28 34 public class SysMenuServiceTest extends BaseDbUnitTest {
29 35  
30   -
31 36 @Resource
32 37 private SysMenuServiceImpl sysMenuService;
33 38  
... ... @@ -40,16 +45,47 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
40 45 @Resource
41 46 private SysMenuMapper menuMapper;
42 47  
  48 + @Test
  49 + public void testInitLocalCache_success() throws Exception {
  50 + SysMenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
  51 + menuMapper.insert(menuDO1);
  52 + SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
  53 + menuMapper.insert(menuDO2);
  54 +
  55 + //调用
  56 + sysMenuService.initLocalCache();
  57 +
  58 + // 获取代理对象
  59 + SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
  60 +
  61 + Map<Long, SysMenuDO> menuCache = (Map<Long, SysMenuDO>) BeanUtil.getFieldValue(target, "menuCache");
  62 + Assert.isTrue(menuCache.size()==2);
  63 + AssertUtils.assertPojoEquals(menuDO1,menuCache.get(menuDO1.getId()));
  64 + AssertUtils.assertPojoEquals(menuDO2,menuCache.get(menuDO2.getId()));
  65 +
  66 + Multimap<String, SysMenuDO> permissionMenuCache = (Multimap<String, SysMenuDO>) BeanUtil.getFieldValue(target, "permissionMenuCache");
  67 + Assert.isTrue(permissionMenuCache.size()==2);
  68 + AssertUtils.assertPojoEquals(menuDO1,permissionMenuCache.get(menuDO1.getPermission()));
  69 + AssertUtils.assertPojoEquals(menuDO2,permissionMenuCache.get(menuDO2.getPermission()));
  70 +
  71 + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime");
  72 + assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime);
  73 + }
43 74  
44 75 @Test
45 76 public void testCreateMenu_success() {
46 77 //构造父目录
47   - SysMenuDO menuDO = createParentMenuDO(MenuTypeEnum.MENU);
  78 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
48 79 menuMapper.insert(menuDO);
49 80 Long parentId = menuDO.getId();
50 81  
51 82 //调用
52   - SysMenuCreateReqVO vo = createReqVO(parentId);
  83 + SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> {
  84 + o.setParentId(parentId);
  85 + o.setName("testSonName");
  86 + o.setType(MenuTypeEnum.MENU.getType());
  87 + o.setStatus(RandomUtils.randomCommonStatus());
  88 + });
53 89 Long menuId = sysMenuService.createMenu(vo);
54 90  
55 91 //断言
... ... @@ -66,44 +102,343 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
66 102 Long parentId = RandomUtils.randomLongId();
67 103  
68 104 // 调用
69   - SysMenuCreateReqVO vo = createReqVO(parentId);
  105 + SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> {
  106 + o.setParentId(parentId);
  107 + o.setName("testSonName");
  108 + o.setType(MenuTypeEnum.MENU.getType());
  109 + o.setStatus(RandomUtils.randomCommonStatus());
  110 + });
70 111  
71 112 // 调用, 并断言异常
72 113 AssertUtils.assertServiceException(() -> sysMenuService.createMenu(vo), MENU_PARENT_NOT_EXISTS);
73 114 }
74 115  
75 116 @Test
76   - public void testCreateMenu_checkParentIsDirOrMenu() {
  117 + public void testCreateMenu_checkParentTypeError() {
77 118 //构造父目录
78   - SysMenuDO menuDO = createParentMenuDO(MenuTypeEnum.BUTTON);
  119 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L);
79 120 menuMapper.insert(menuDO);
80 121 Long parentId = menuDO.getId();
81 122  
82 123 // 调用
83   - SysMenuCreateReqVO vo = createReqVO(parentId);
  124 + SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> {
  125 + o.setParentId(parentId);
  126 + o.setName("testSonName");
  127 + o.setType(MenuTypeEnum.MENU.getType());
  128 + o.setStatus(RandomUtils.randomCommonStatus());
  129 + });
84 130  
85 131 // 调用, 并断言异常
86 132 AssertUtils.assertServiceException(() -> sysMenuService.createMenu(vo), MENU_PARENT_NOT_DIR_OR_MENU);
87 133 }
88 134  
  135 + @Test
  136 + public void testUpdateMenu_success() {
  137 + //构造父子目录
  138 + SysMenuDO sonMenuDO = initParentAndSonMenuDO();
  139 + Long sonId = sonMenuDO.getId();
  140 + Long parentId = sonMenuDO.getParentId();
89 141  
90   - private SysMenuCreateReqVO createReqVO(Long parentId) {
91   - SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> {
  142 + //调用
  143 + SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
  144 + o.setId(sonId);
92 145 o.setParentId(parentId);
93   - o.setName("testSonName");
94 146 o.setType(MenuTypeEnum.MENU.getType());
95 147 o.setStatus(RandomUtils.randomCommonStatus());
  148 + o.setName("pppppp"); //修改名字
96 149 });
97   - return vo;
  150 + sysMenuService.updateMenu(vo);
  151 +
  152 + //断言
  153 + // 校验记录的属性是否正确
  154 + SysMenuDO ret = menuMapper.selectById(sonId);
  155 + AssertUtils.assertPojoEquals(vo, ret);
  156 + // 校验调用
  157 + verify(sysMenuProducer).sendMenuRefreshMessage();
98 158 }
99 159  
100   - private SysMenuDO createParentMenuDO(MenuTypeEnum typeEnum) {
101   - SysMenuDO menuDO = randomPojo(SysMenuDO.class, o -> {
102   - o.setName("testParentName");
103   - o.setType(typeEnum.getType());
  160 + @Test
  161 + public void testUpdateMenu_sonIdNotExist() {
  162 + Long sonId = 99999L;
  163 + Long parentId = 10000L;
  164 +
  165 + //调用
  166 + SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
  167 + o.setId(sonId);
  168 + o.setParentId(parentId);
  169 + o.setType(MenuTypeEnum.MENU.getType());
  170 + o.setStatus(RandomUtils.randomCommonStatus());
  171 + });
  172 + //断言
  173 + AssertUtils.assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_NOT_EXISTS);
  174 + }
  175 +
  176 + @Test
  177 + public void testUpdateMenu_canNotSetSelfToBeParent() {
  178 + //构造父子目录
  179 + SysMenuDO sonMenuDO = initParentAndSonMenuDO();
  180 + Long sonId = sonMenuDO.getId();
  181 +
  182 + long updateParentId = sonId;
  183 +
  184 + //调用
  185 + SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
  186 + o.setId(sonId);
  187 + o.setParentId(updateParentId);
  188 + o.setType(MenuTypeEnum.MENU.getType());
  189 + o.setStatus(RandomUtils.randomCommonStatus());
  190 + });
  191 + //断言
  192 + AssertUtils.assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_PARENT_ERROR);
  193 + }
  194 +
  195 + @Test
  196 + public void testUpdateMenu_parentNotExist() {
  197 + //构造父子目录
  198 + SysMenuDO sonMenuDO = initParentAndSonMenuDO();
  199 + Long sonId = sonMenuDO.getId();
  200 +
  201 + long updateParentId = -999999;
  202 +
  203 + //调用
  204 + SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
  205 + o.setId(sonId);
  206 + o.setParentId(updateParentId);
  207 + o.setType(MenuTypeEnum.MENU.getType());
  208 + o.setStatus(RandomUtils.randomCommonStatus());
  209 + });
  210 + //断言
  211 + AssertUtils.assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_PARENT_NOT_EXISTS);
  212 + }
  213 +
  214 + @Test
  215 + public void testUpdateMenu_parentTypeError() {
  216 + SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "son", 999L);
  217 + menuMapper.insert(sonMenuDO);
  218 + Long sonId = sonMenuDO.getId();
  219 +
  220 + //button类型
  221 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L);
  222 + menuMapper.insert(menuDO);
  223 + Long parentId = menuDO.getId();
  224 +
  225 + //调用
  226 + SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
  227 + o.setId(sonId);
  228 + o.setParentId(parentId);
  229 + o.setType(MenuTypeEnum.MENU.getType());
  230 + o.setStatus(RandomUtils.randomCommonStatus());
  231 + });
  232 + //断言
  233 + AssertUtils.assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_PARENT_NOT_DIR_OR_MENU);
  234 + }
  235 +
  236 + @Test
  237 + public void testUpdateMenu_sonMenuNameDuplicate() {
  238 + SysMenuDO parent = createMenuDO(MenuTypeEnum.MENU, "parent", 999L);
  239 + menuMapper.insert(parent);
  240 + Long parentId = parent.getId();
  241 +
  242 +
  243 + SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "son", parentId);
  244 + menuMapper.insert(sonMenuDO);
  245 +
  246 + SysMenuDO sonMenuDO2 = createMenuDO(MenuTypeEnum.MENU, "son2", parentId);
  247 + menuMapper.insert(sonMenuDO2);
  248 +
  249 + Long sonId = sonMenuDO.getId();
  250 + String updateName = sonMenuDO2.getName();
  251 +
  252 + //调用
  253 + SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
  254 + o.setId(sonId);
  255 + o.setParentId(parentId);
  256 + o.setType(MenuTypeEnum.MENU.getType());
104 257 o.setStatus(RandomUtils.randomCommonStatus());
  258 + o.setName(updateName);
  259 + });
  260 + //断言
  261 + AssertUtils.assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_NAME_DUPLICATE);
  262 + }
  263 +
  264 + @Test
  265 + public void testDeleteMenu_success() {
  266 + SysMenuDO sonMenuDO = initParentAndSonMenuDO();
  267 +
  268 + Long sonId = sonMenuDO.getId();
  269 + //调用
  270 + sysMenuService.deleteMenu(sonId);
  271 +
  272 + //断言
  273 + SysMenuDO menuDO = menuMapper.selectById(sonId);
  274 + Assert.isNull(menuDO);
  275 + verify(sysPermissionService).processMenuDeleted(sonId);
  276 + verify(sysMenuProducer).sendMenuRefreshMessage();
  277 + }
  278 +
  279 + @Test
  280 + public void testDeleteMenu_menuNotExist() {
  281 + Long sonId = 99999L;
  282 +
  283 + AssertUtils.assertServiceException(() -> sysMenuService.deleteMenu(sonId), MENU_NOT_EXISTS);
  284 + }
  285 +
  286 + @Test
  287 + public void testDeleteMenu_existChildren() {
  288 + SysMenuDO sonMenu = initParentAndSonMenuDO();
  289 + Long parentId = sonMenu.getParentId();
  290 +
  291 + AssertUtils.assertServiceException(() -> sysMenuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN);
  292 + }
  293 +
  294 + @Test
  295 + public void testGetMenus_success() {
  296 + Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
  297 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
  298 + menuMapper.insert(menuDO);
  299 + idMenuMap.put(menuDO.getId(), menuDO);
  300 +
  301 + SysMenuDO sonMenu = createMenuDO(MenuTypeEnum.MENU, "son", menuDO.getId());
  302 + menuMapper.insert(sonMenu);
  303 + idMenuMap.put(sonMenu.getId(), sonMenu);
  304 +
  305 + //调用
  306 + List<SysMenuDO> menuDOS = sysMenuService.getMenus();
  307 +
  308 + //断言
  309 + Assert.isTrue(menuDOS.size() == idMenuMap.size());
  310 + for (SysMenuDO menu : menuDOS) {
  311 + AssertUtils.assertPojoEquals(idMenuMap.get(menu.getId()), menu);
  312 + }
  313 + }
  314 +
  315 +
  316 + @Test
  317 + public void testGetMenusReqVo_success() {
  318 + Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
  319 + SysMenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1);
  320 + menuMapper.insert(menu);
  321 + idMenuMap.put(menu.getId(), menu);
  322 +
  323 + menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1);
  324 + menuMapper.insert(menu);
  325 + idMenuMap.put(menu.getId(), menu);
  326 +
  327 + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1);
  328 + menuMapper.insert(menu);
  329 + idMenuMap.put(menu.getId(), menu);
  330 +
  331 +
  332 + menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1);
  333 + menuMapper.insert(menu);
  334 + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2);
  335 + menuMapper.insert(menu);
  336 +
  337 +
  338 + //调用
  339 + SysMenuListReqVO reqVO = new SysMenuListReqVO();
  340 + reqVO.setStatus(1);
  341 + reqVO.setName("name");
  342 + List<SysMenuDO> menuDOS = sysMenuService.getMenus(reqVO);
  343 +
  344 + //断言
  345 + Assert.isTrue(menuDOS.size() == idMenuMap.size());
  346 + for (SysMenuDO m : menuDOS) {
  347 + AssertUtils.assertPojoEquals(idMenuMap.get(m.getId()), m);
  348 + }
  349 + }
  350 +
  351 + @Test
  352 + public void testListMenusFromCache_success() throws Exception {
  353 + Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
  354 + //获取代理对象
  355 + SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
  356 + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
  357 +
  358 + Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
  359 + SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
  360 + mockCacheMap.put(menuDO.getId(), menuDO);
  361 + idMenuMap.put(menuDO.getId(), menuDO);
  362 +
  363 + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
  364 + mockCacheMap.put(menuDO.getId(), menuDO);
  365 + idMenuMap.put(menuDO.getId(), menuDO);
  366 +
  367 +
  368 + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
  369 + mockCacheMap.put(menuDO.getId(), menuDO);
  370 + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
  371 + mockCacheMap.put(menuDO.getId(), menuDO);
  372 +
  373 + List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Arrays.asList(MenuTypeEnum.MENU.getType()), Arrays.asList(1));
  374 + Assert.isTrue(menuDOS.size() == idMenuMap.size());
  375 + for (SysMenuDO m : menuDOS) {
  376 + AssertUtils.assertPojoEquals(idMenuMap.get(m.getId()), m);
  377 + }
  378 + }
  379 +
  380 +
  381 + @Test
  382 + public void testListMenusFromCache2_success() throws Exception {
  383 + Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
  384 + //获取代理对象
  385 + SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
  386 + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
  387 +
  388 + Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
  389 + SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
  390 + mockCacheMap.put(menuDO.getId(), menuDO);
  391 + idMenuMap.put(menuDO.getId(), menuDO);
  392 +
  393 + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
  394 + mockCacheMap.put(menuDO.getId(), menuDO);
  395 + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
  396 + mockCacheMap.put(menuDO.getId(), menuDO);
  397 + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
  398 + mockCacheMap.put(menuDO.getId(), menuDO);
  399 +
  400 + List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Arrays.asList(1L),
  401 + Arrays.asList(MenuTypeEnum.MENU.getType()), Arrays.asList(1));
  402 + Assert.isTrue(menuDOS.size() == idMenuMap.size());
  403 + for (SysMenuDO m : menuDOS) {
  404 + AssertUtils.assertPojoEquals(idMenuMap.get(m.getId()), m);
  405 + }
  406 + }
  407 +
  408 + /**
  409 + * 构造父子目录,返回子目录
  410 + *
  411 + * @return
  412 + */
  413 + private SysMenuDO initParentAndSonMenuDO() {
  414 + //构造父子目录
  415 + SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
  416 + menuMapper.insert(menuDO);
  417 + Long parentId = menuDO.getId();
  418 +
  419 + SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId);
  420 + menuMapper.insert(sonMenuDO);
  421 + return sonMenuDO;
  422 + }
  423 +
  424 + private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) {
  425 + return createMenuDO(typeEnum, menuName, parentId, RandomUtils.randomCommonStatus());
  426 + }
  427 +
  428 + private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
  429 + return createMenuDO(null, typeEnum, menuName, parentId, status);
  430 + }
  431 +
  432 + private SysMenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
  433 + SysMenuDO sonMenuDO = RandomUtils.randomPojo(SysMenuDO.class, o -> {
  434 + o.setId(id);
  435 + o.setParentId(parentId);
  436 + o.setType(typeEnum.getType());
  437 + o.setStatus(status);
  438 + o.setName(menuName);
105 439 });
106   - return menuDO;
  440 + return sonMenuDO;
107 441 }
108 442  
  443 +
109 444 }
... ...
src/test/java/cn/iocoder/dashboard/util/AopTargetUtils.java 0 → 100644
  1 +package cn.iocoder.dashboard.util;
  2 +
  3 +import org.springframework.aop.framework.AdvisedSupport;
  4 +import org.springframework.aop.framework.AopProxy;
  5 +import org.springframework.aop.support.AopUtils;
  6 +
  7 +import java.lang.reflect.Field;
  8 +
  9 +/**
  10 + * http://www.bubuko.com/infodetail-3471885.html
  11 + */
  12 +public class AopTargetUtils {
  13 +
  14 +
  15 + /**
  16 + * 获取 目标对象
  17 + *
  18 + * @param proxy 代理对象
  19 + * @return
  20 + * @throws Exception
  21 + */
  22 + public static Object getTarget(Object proxy) throws Exception {
  23 +
  24 + if (!AopUtils.isAopProxy(proxy)) {
  25 + return proxy; //不是代理对象
  26 + }
  27 +
  28 + if (AopUtils.isJdkDynamicProxy(proxy)) {
  29 + return getJdkDynamicProxyTargetObject(proxy);
  30 + } else { //cglib
  31 + return getCglibProxyTargetObject(proxy);
  32 + }
  33 +
  34 + }
  35 +
  36 +
  37 + private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
  38 + Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
  39 + h.setAccessible(true);
  40 + Object dynamicAdvisedInterceptor = h.get(proxy);
  41 +
  42 + Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
  43 + advised.setAccessible(true);
  44 +
  45 + Object target = ((AdvisedSupport) advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
  46 +
  47 + return target;
  48 + }
  49 +
  50 + private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
  51 + Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
  52 + h.setAccessible(true);
  53 + AopProxy aopProxy = (AopProxy) h.get(proxy);
  54 +
  55 + Field advised = aopProxy.getClass().getDeclaredField("advised");
  56 + advised.setAccessible(true);
  57 +
  58 + Object target = ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget();
  59 +
  60 + return target;
  61 + }
  62 +
  63 +}
0 64 \ No newline at end of file
... ...