首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AEM 6.3:调用POST Servlet时出错

AEM 6.3:调用POST Servlet时出错
EN

Stack Overflow用户
提问于 2017-11-21 11:30:17
回答 3查看 3.1K关注 0票数 3

我已经创建了一个POST servlet,如下所示:

代码语言:javascript
运行
复制
package com.aem.sites.servlets;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletException;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aem.sites.interfaces.SubscriptionConfiguration;

@Component(immediate=true,
service=Servlet.class,
configurationPid="com.aem.sites.servlets.SubscriptionServlet",
property = {
        "sling.servlet.methods=POST", 
        "sling.servlet.selectors=newsletters",
        "sling.servlet.resourceTypes=aemsite-project/components/structure/page",
        "sling.servlet.extensions=html" 
}
        )
@Designate(ocd=SubscriptionConfiguration.class)
public class SubscriptionServlet extends SlingAllMethodsServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    protected void doPost(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws ServletException, IOException  {
        logger.info("====================================================SubscriptionServlet::::::::::SubscriptionConfiguration=====================================");
    }

    @Activate
    @Modified
    protected void Activate(SubscriptionConfiguration config) {
        logger.info("********************************inside SubscriptionConfiguration servlet*****************************************");
    }

}

我使用resourceType调用servlet,而selector.The servlet是通过表单调用的:

代码语言:javascript
运行
复制
<div id = "sign-up" style ="padding-top:6%;padding-left:2%">
  <div>
    <h1 style="font-size:2em">Subscribe to Newsletters</h1>
    <form name = "subscriptionForm" method = "POST" action="/content/aemsite/en/subscribe.newsletters.html" id="subscriptionForm">
    <input type="text" name="name" id="name" placeholder="Name" style="margin-bottom:1%;width:30%"/>
    <input type="text" name="email" id="email" placeholder="E-mail" style="margin-bottom:1%;width:30%"/>

    <input type="submit" name="signup_submit" value="Sign me up" style="margin-bottom:3%"/>
    </form>
  </div> 

</div>

这是作为clientlibs包含的javascript文件

代码语言:javascript
运行
复制
$(function() {
    $('#subscriptionForm').submit(function(e) {
        e.preventDefault(); //STOP default action
        var formURL = $(this).attr("action");
        var method = $(this).attr("method");
        var name = $('#name').val();
        var email = $('#email').val();
        var form_data = $(this).serialize(); 
        console.log('inside subscription form '+form_data+' formURL '+formURL);
        $.ajax({
            type:method,
            url:formURL,
            data: form_data, success:function(data){
              }
        });
    });
});

我使用AEM提供的开箱即用的jQuery。当我提交表单时,它会抛出一些错误。以下是我看到的错误:

代码语言:javascript
运行
复制
Failed to load resource: the server responded with a status of 500 (Server Error)

上面是我在chrome调试器上看到的错误。在error.log文件中,我看到以下错误:

代码语言:javascript
运行
复制
20.11.2017 22:13:42.802 *ERROR* [0:0:0:0:0:0:0:1 [1511234022796] POST /content/aemsite/en/subscribe.newsletters.html HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation Exception during response processing.
javax.jcr.nodetype.ConstraintViolationException: No matching property definition: name = aemsite

代码语言:javascript
运行
复制
POST /content/aemsite/en/subscribe.newsletters.html HTTP/1.1] org.apache.sling.jcr.resource.internal.helper.JcrPropertyMapCacheEntry converToType: Cannot convert value of 2017/11/18 02:28:18 to class java.util.Calendar
java.lang.IllegalArgumentException: Not a date string: 2017/11/18 02:28:18

看起来POST请求试图保存一个属性,但在servlet中,我要做的就是输出在servlet的doPost方法中设置的记录器消息。当我将请求类型从POST更改为GET时,错误消失,并调用servlet。

我读到过,从AEM6开始,POST请求采用了更多的安全措施,因此使用了CSRF令牌,但如果使用AEM6的jQuery版本,则大多数情况下都会进行处理。

我不确定我做错了什么。任何帮助都是非常感谢的。

提前感谢

更新:

jcrresolver映射的结果

EN

回答 3

Stack Overflow用户

发布于 2017-12-06 21:48:41

当您post到解析为cq:Page的路径时,您的带有resourceType的servlet将不会被调用。

Post to - your_page_path/jcr:content以获取基于资源的servlet来处理此请求

另外,不建议对路径进行硬编码。我过去为这样的场景所做的是有一个组件,在你的例子中,你可以将它称为订阅组件,表单可以像这样发布-

代码语言:javascript
运行
复制
 <form action="${resource.path}.yourselector.html" method="post">

并且您的servlet resourceType是组件。

票数 2
EN

Stack Overflow用户

发布于 2017-11-27 18:10:31

当使用POST时,由于某种原因,默认的POST servlet被调用。这是显而易见的,因为ModifyOperation已经被执行了。

我建议您使用Recent Requests console page来查看您的资源是如何标识的,以及脚本是如何解析的。

票数 1
EN

Stack Overflow用户

发布于 2017-11-28 00:47:12

我最近发现,尝试使用resourceType和OSGi一起执行POST请求可能实际上并不起作用。当我使用path调用POST时,一切工作正常。我使用了resourceType的OSGi DS和GET调用,它工作得很好,但将其更改为POST并不能真正起作用。我不知道这是不是一个bug,但这就是我目前所能得出的结论。使用path是进行POST调用的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47404711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档