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

AEM中点击按钮调用Servlet重定向不生效问题排查

问题根因

你的代码有3处核心错误,导致Servlet完全没命中、逻辑不执行:

  • Servlet请求方法配置与实现不匹配:你给Servlet配置的sling.servlet.methods=get,声明只处理GET请求,但代码里仅重写了doPost方法,没有任何GET请求的处理逻辑,请求进来不会执行你的重定向代码。
  • OSGi服务注入类型错误:你的DemoInterfaceImpl注册为IDemoInterface类型的OSGi服务,但代码里@Reference注入的是实现类DemoInterfaceImpl,会直接导致服务注入失败,就算请求进到方法里也会抛空指针。
  • Servlet匹配规则配置错误:sling.servlet.resourceTypes配置项需要填节点的sling:resourceType属性值,你直接填了内容路径/content/wknd-events,Sling根本不会把对应路径的请求映射到这个Servlet上。

另外补充:你前端用<a>标签跳转默认发的是GET请求,本身和你只实现doPost的逻辑也是冲突的。

修复方案

按以下步骤调整即可:

  1. 修正Servlet代码,对齐请求方法、注入类型,参考代码如下:
@Component(service = Servlet.class,
        property = {
                "sling.servlet.methods=GET",
                // 方案1:按资源类型匹配,替换成你/content/wknd-events节点实际的sling:resourceType值
                "sling.servlet.resourceTypes=wknd-events/components/xxx",
                // 方案2:嫌查资源类型麻烦就直接用路径匹配,注释掉上面resourceTypes配置,开启下面这行
                // "sling.servlet.paths=/content/wknd-events"
        })
public class MainServlet extends SlingAllMethodsServlet {

    // 注入服务接口,不要直接注入实现类
    @Reference
    IDemoInterface demoInterface;

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        demoInterface.redirectUser(request, response);
    }
}
  1. 前端代码如果要保留普通链接跳转的形式不需要修改,点击后会发GET请求命中修正后的Servlet,自动完成重定向。
  2. 如果你坚持要用POST请求触发逻辑,需要做两处调整:
    • 给Servlet的methods配置加上POST,同时保留doPost方法实现
    • 把前端a标签改成POST提交表单:
    <form action="/content/wknd-events.html" method="post">
        <button type="submit">go</button>
    </form>
    

改完后确保两个OSGi组件都正常启动,没有注入报错,点击按钮就会正常跳转到目标页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.10 16:15:47