Servlets AEM 6.3:调用POST Servlet时出错

Servlets AEM 6.3:调用POST Servlet时出错,servlets,aem,sling,Servlets,Aem,Sling,我创建了一个如下所示的POST servlet: 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.SlingHttpSer

我创建了一个如下所示的POST servlet:

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和selector调用servlet。通过以下表单调用servlet:

<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>
我正在使用AEM提供的现成jQuery。当我提交表单时,它会抛出一些错误。以下是我看到的错误:

Failed to load resource: the server responded with a status of 500 (Server Error)
以上是我在chrome Debugger上看到的错误。在error.log文件中,我看到以下错误:

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

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

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

我不确定我做错了什么。感谢您的帮助

提前谢谢

更新:

jcrresolver映射的结果


POST
由于某种原因调用默认的POST servlet时。由于执行了
ModifyOperation
,因此这一点非常明显


我建议您使用查看如何识别资源以及如何解析脚本。

我最近发现,尝试使用resourceType和OSGi执行POST请求可能实际上不起作用。当我使用path调用POST时,一切正常。我使用了OSGi DS,并使用resourceType进行了GET调用,效果很好,但将其更改为POST并没有真正起作用。我不知道这是否是一个错误,但这是我现在可以得出的结论。使用path是执行POST调用的方法。

当您发布到解析为
cq:Page
的路径时,将不会调用您的resourceType servlet

发布到-
您的页面路径/jcr:content
以获取基于资源的servlet来处理此请求

此外,不建议对路径进行硬编码。我过去在这种情况下所做的是有一个组件,在您的情况下,您可以称之为订阅组件,表单可以如下所示发布-

 <form action="${resource.path}.yourselector.html" method="post">


您是否检查了URL
/content/aemsite/en/subscribe.newsletters.html
是否正确解析为您的servlet?您可以通过资源解析程序控制台
/system/console/jcresolver
进行验证。还要验证您的servlet是否处于活动状态。感谢您的回复。我可以确认servlet是活动的,并且我已经附上了jcrresolver的屏幕截图。这应该是可以接受的答案。您不仅提到了根本原因,还提到了解决方案。谢谢。
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
 <form action="${resource.path}.yourselector.html" method="post">