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的逻辑也是冲突的。
修复方案
按以下步骤调整即可:
- 修正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); } }
- 前端代码如果要保留普通链接跳转的形式不需要修改,点击后会发GET请求命中修正后的Servlet,自动完成重定向。
- 如果你坚持要用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
相关产品推荐
相关产品推荐

