侧边栏壁纸
博主头像
大数互联博主等级

HI,你好

  • 累计撰写 58 篇文章
  • 累计创建 55 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

unit-boot之springboot整合@Component无法生效问题解决

大数互联
2024-01-18 / 0 评论 / 0 点赞 / 10 阅读 / 320 字

如题,在整合springboot到equinox时,无法扫描到当前启动类包下的@Component等spring注解类到spring上下文,从而导致相应的bean无法被扫描到。

解决方法

根本原因是spring没有默认提供osgi bundle资源协议解析处理类,导致无法获得资源,直接上代码
image-1705565475343
标红的位置为空,导致无法在equinox获得资源,此实例在初始化时静态块中加载
image-1705565553372
应该是此处加载失败导致。
定位到原因,那就好解决了,上当前的解决代码

    /**
     * 为spring的类扫描路径增加osgi资资解析处理。(将获得的:bundleresource://xxx/xxx.xx转换为绝对路径file:///xxx/xxx.xx).
     * spring的类PathMatchingResourcePatternResolver有静态块会尝试检查是否是OSGI环境,如是则会设置Equinox的资源处理。
     */
    public static void addOSGIScanPathResolve() {
        try {
            final Field equinoxResolveMethodField = PathMatchingResourcePatternResolver.class.getDeclaredField("equinoxResolveMethod");
            boolean fieldAccessAble = equinoxResolveMethodField.isAccessible();
            equinoxResolveMethodField.setAccessible(true);

            final Bundle equinoxCommonBundle = SpringUnitUtil.getBundleBySymbolicName("org.eclipse.equinox.common", "3.6.200.v20130402-1505");
            final Class FileLocatorClaass = equinoxCommonBundle.loadClass("org.eclipse.core.runtime.FileLocator");
            final Method resolveMethod = FileLocatorClaass.getMethod("resolve", URL.class);
            equinoxResolveMethodField.set(null,resolveMethod);
            equinoxResolveMethodField.setAccessible(fieldAccessAble);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

以上方法在启动器启动时调用即可。

0

评论区