You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AEM项目JUnit测试出现java.lang.NullPointerException问题排查

问题根因

adaptTo()返回null直接触发NPE,是几个AEM单元测试的常见问题叠加导致的:

  • 类与资源类型映射完全不匹配:你JSON里配置的节点sling:resourceType是project/components/core/title,但你注册到上下文的模型只有TestImpl.class,甚至测试方法里还出现了适配Title.class的代码,Sling模型适配机制找不到和当前资源类型、适配目标类绑定的实现类,直接返回null。
  • Mock的服务未生效:你用@Mock生成的ModelFactory实例没有注册到AemContext的内置OSGi容器中,上下文适配模型时调用的是容器内部自带的服务实例,你写的mock打桩逻辑根本不会触发。
  • 模型适配源配置不匹配:如果你的TestImpl类上的@Model注解没有指定adaptables = SlingHttpServletRequest.class,默认不支持从request对象适配,只能从Resource对象适配,调用request.adaptTo()自然返回null。
  • JSON结构不完整:你贴的JSON文件最外层缺失根节点大括号,会导致JSON加载后/content/text节点未正确初始化,currentResource()指向的路径不存在时适配也会返回null。
修复方案

按以下顺序调整代码即可解决:

  1. 统一模型、资源类型、适配类的对应关系
    首先给TestImpl加上正确的模型注解,确保和组件资源类型绑定:
    @Model(
        adaptables = SlingHttpServletRequest.class, // 声明支持从request适配
        adapters = Test.class, // 声明适配的目标接口
        resourceType = "project/components/core/test" // 和组件sling:resourceType保持一致
    )
    public class TestImpl implements Test {
        @ValueMapValue
        private String text;
    
        @Override
        public String getText() {
            return text;
        }
    }
    
    同时修正测试JSON里的资源类型配置,补全JSON结构:
    {
      "text": {
        "jcr:primaryType": "nt:unstructured",
        "sling:resourceType": "project/components/core/test",
        "text": "textTEST"
      }
    }
    
  2. 清理无效Mock代码
    如果你的TestImpl内部没有主动注入ModelFactory做嵌套模型调用,直接删掉所有ModelFactory相关的@Mock和打桩代码即可——AemContext自带的测试版ModelFactory会自动完成模型适配,不需要额外Mock。如果确实需要Mock ModelFactory,在setUp方法里加一行把Mock实例注册到上下文容器:
    ctx.registerService(ModelFactory.class, modelFactory);
    
  3. 修正测试方法逻辑
    不要跨类适配,确保适配的目标类和你注册的模型一致,同时增加非空断言方便排查问题:
    @Test
    void testGetText() {
        final String expected = "textTEST";
        ctx.currentResource("/content/text");
        // 确认资源加载正确
        assertEquals("/content/text", ctx.currentResource().getPath());
        Test test = ctx.request().adaptTo(Test.class);
        // 提前做非空校验,避免直接抛NPE找不到根因
        assertNotNull(test);
        String actual = test.getText();
        assertEquals(expected, actual);
    }
    
    如果你的模型设计为仅支持从Resource适配,把适配代码改成Test test = ctx.currentResource().adaptTo(Test.class)即可,同时把@Model注解里的adaptables参数改为Resource.class。

排错提示:AEM Sling模型适配失败时不会主动抛明确异常,只会返回null,遇到这类问题优先按「资源路径是否存在→资源类型是否和模型绑定→适配源是否在@Model注解中声明→模型类是否注册到AemContext」的顺序排查即可。

内容的提问来源于stack exchange,提问作者Hyb90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:09:15