AEM 6.3: Fehler beim Aufruf der POST-Servlet

Habe ich eine POST-servlet wie folgt:

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*****************************************");
    }

}

Rufe ich das servlet über resourceType und Wähler.Das servlet wird aufgerufen durch:

<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>

dies ist die javascript-Datei eingefügt wird als clientlibs

$(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){
              }
        });
    });
});

Ich bin mit dem jQuery zur Verfügung gestellt out of the box mit AEM. Wenn ich das Formular abschicken wirft es einige Fehler. Diese sind die Fehler, die ich sehe:

Failed to load resource: the server responded with a status of 500 (Server Error)

Oben ist der Fehler, die ich bin, zu sehen auf der chrome debuuger. In der Fehlermeldung.log-Datei sehe ich diesen Fehler:

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

und

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

Es sieht aus wie die POST-Anfrage versucht zu retten, eine Eigenschaft, aber in der servlet-alles was ich versuche zu tun, ist die Ausgabe der logger-message-set in der doPost-Methode des servlet. Wenn ich den request-Typ von der POST zu HOLEN, die Fehler verschwinden, und das servlet wird immer genannt.

Hatte ich gelesen, dass von AEM 6 an weitere Sicherheits-Maßnahmen umgesetzt werden für die POST-Anforderung und somit ein CSRF-token verwendet wird, aber meist wird es gehandhabt, wenn AEM version von jQuery verwendet wird.

Ich bin nicht sicher, was es ist, dass ich Tue, falsch. Jede Hilfe ist willkommen.

Vielen Dank im Voraus

UPDATE:

Ergebnis jcrresolver mapping

AEM 6.3: Fehler beim Aufruf der POST-Servlet

  • Haben Sie überprüft, ob die URL /content/aemsite/en/subscribe.newsletters.html ist die Lösung zu Ihrem servlet korrekt? Sie können überprüfen, durch die Ressourcen-resolver-Konsole /system/console/jcrresolver. Überprüfen Sie auch, wenn Ihr servlet aktiv ist.
  • Danke für die Antwort. Ich kann bestätigen, das servlet ist aktiv und ich habe anbei der screenshot von der jcrresolver.
InformationsquelleAutor user972418 | 2017-11-21

 

3 Replies
  1. 1

    Wenn Sie post an einen Pfad, der aufgelöst wird, zu einem cq:Page Ihr servlet mit resourceType wird auch nicht aufgerufen.

    Post – your_page_path/jcr:content um Ihre Ressourcen-basierten servlet zum verarbeiten dieser Anforderung

    Auch hart codierten Pfad wird nicht empfohlen. Was ich getan habe in der Vergangenheit für solche Szenarien ist eine Komponente, in deinem Fall könnte man es nennen-Abonnement-Komponente und das Formular versendet werden konnte wie –

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

    Und Ihr servlet resourceType der Komponente.

    • Dies sollte die akzeptierte Antwort. Sie nicht nur erwähnt, die Ursache aber auch die Lösung. Es zu schätzen wissen.
  2. 0

    Vor kurzem fand ich heraus, dass versuchen zu tun, eine POST-Anforderung mit resourceType alongwith OSGi könnte nicht wirklich funktionieren. Funktioniert alles wunderbar, wenn ich POST mit einem Pfad. Ich habe verwendet die OSGi-DS und für einen GET-Aufruf mit resourceType und es funktioniert gut, aber ändern Sie es zu POST funktioniert nicht wirklich. Ich weiß nicht, ob das ein bug ist, aber dies kann ich Schluss für jetzt. Mit Pfad ist der Weg für ein POST-Aufruf.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.