2017-10-12 2 views
2

Ich möchte prüfen, ob eine Sling-Ressource bereits existiert. Derzeit verwende ich CQ.HTTP.get(url), um dies zu erreichen. Das Problem ist, dass, wenn die Ressource nicht existiert, JS einen Fehler 404 auf der Konsole protokolliert, was ich hässlich finde.JS: Überprüfen, ob die Sling-Ressource existiert, ohne 404 zu erzeugen Fehler

Gibt es eine bessere Möglichkeit zu überprüfen, ob eine Ressource existiert, die die Konsole nicht verschmutzt?

+0

Ihre eigenen Servlet schreiben, machen es zu einem Rück Wahr/Falsch mit einem Status von 200. – awd

Antwort

3

Hier ist ein einfaches Servlet, das tut, was Sie fragen:

/** 
* Servlet that checks if resource exists. 
*/ 
@SlingServlet 
(
    paths = "/bin/exists", 
    extensions = "html", 
    methods = "GET" 
) 
public class ResourceExistsServlet extends SlingSafeMethodsServlet { 

    @Override 
    protected void doGet(final SlingHttpServletRequest request, 
         final SlingHttpServletResponse response) throws ServletException, IOException { 
     // get the resource by the suffix 
     // for example, in the request /bin/exists.htm/apps, "/apps" is the suffix and that's the resource obtained here. 
     Resource resource = request.getRequestPathInfo().getSuffixResource(); 
     // resource is null, does not exist, not null, exists 
     boolean exists = resource != null; 
     // make the response content type JSON 
     response.setContentType(JSONResponse.APPLICATION_JSON_UTF8); 
     // Write the json to the response 
     // TODO: use a library for more complicated JSON, like google's gson. In this case, this string suffices. 
     response.getWriter().write("{\"exists\": "+exists+"}"); 
    } 
} 

Und hier einige Beispiel JS das Servlet aufzurufen:

// Check if a path exists exists 
function exists(path){ 
    return $.getJSON("/bin/exists.html"+path); 
} 

// check if /apps exists 
exists("/apps") 
.then(function(res){console.log(res.exists)}) 
// prints: true 


// check if /apps123 exists 
exists("/apps123") 
.then(function(res){console.log(res.exists)}) 
// prints: false 
+0

Ich würde vorschlagen, die folgenden Verbesserungen: - verwenden [org.apache.sling.commons.json.JSONObject] (https://sling.apache.org/apidocs/sling7/org/apache/sling/commons/json/JSONObject .html) zum Generieren der JSON-Zeichenkette - ändern Sie die Erweiterung in .json oder lassen Sie sie fallen, da sie keine Auswirkungen hat, wenn Sie die Eigenschaft "paths" setzen – d33t

+1

Dieses Paket ist in AEM veraltet 6.3 –

+0

Das stimmt, danke, dass Sie dies herausgefunden haben. Die Bibliothek wurde aus [rechtlichen Gründen] veraltet (http://markmail.org/thread/3kx7kkeaksqiduz5). Sie finden [hier] (http://blogs.perficient.com/adobe/2017/08/02/aem -6-3-Übergabe-Gefühle-von-Abwertung /) einige Alternativen. Abgesehen davon ist die Frage für cq5, wo dies der übliche Umgang mit json ist. – d33t

Verwandte Themen