How to implement custom error handling in AEM 6.4?

Avatar

Avatar

kiranv40650953

Avatar

kiranv40650953

kiranv40650953

23-05-2019

Hi, I am trying to implement project level custom error handling in aem 6.4, but getting some exception.

Based on project error page should change.I have created 404,500 pages in my content path.

I have followed the below link https://www.albinsblog.com/2018/07/how-to-display-custom-site-specific-error-pages-in-aem.html#.XOfD...

https://www.albinsblog.com/2018/07/how-to-display-custom-site-specific-error-pages-in-aem.html#.XOfD...

These are the steps to reproduce the exception.

Step - 1

Crate java class under core

ErrorHandlerReqStepuestModel.java

import com.day.cq.wcm.api.Page;

import com.day.cq.wcm.api.PageManager;

import org.apache.sling.api.SlingHttpServletRequest;

import org.apache.sling.models.annotations.Default;

import org.apache.sling.models.annotations.DefaultInjectionStrategy;

import org.apache.sling.models.annotations.Model;

import org.apache.sling.models.annotations.injectorspecific.Self;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;

import javax.inject.Inject;

@Model(adaptables = SlingHttpServletRequest.class,

  defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)

public class ErrorHandlerReqStepuestModel {

   protected final Logger logger = LoggerFactory.getLogger(ErrorHandlerRequestModel.class);

   private static final String DEFAULT_ERROR_PAGE = "/content/aem/en";

   private static final String ERROR_CODE_404 = "404";

   private static final int MAX_DEPTH = 2;

   private static final String PATH_SEPERATOR = "/";

   @Self
   private SlingHttpServletRequest slingRequest;

   @Inject
  @Default(values = ERROR_CODE_404)

   private String errorCode;

   private String pagePath;

   @PostConstruct
   protected void init() {

   pagePath = DEFAULT_ERROR_PAGE + errorCode;

   final String requestURI = slingRequest.getRequestPathInfo().getResourcePath();

          if (requestURI != null && !requestURI.equals("")) {

                  pagePath = getErrorPageFromRequestedUrl(errorCode, requestURI);

           }

  }

   private String getErrorPageFromRequestedUrl(final String errorCode, final String requestURI) {

   final Page resolvedPage = getPageFromPath(requestURI);

             if (resolvedPage != null) {

                  return getErrorPathFromPage(errorCode, resolvedPage);

             }

   return null;

  }

   private Page getPageFromPath(String requestURI) {

   final PageManager pageManager = slingRequest.getResourceResolver().adaptTo(PageManager.class);

        while (requestURI.contains(PATH_SEPERATOR)) {

        Page page = pageManager.getContainingPage(requestURI);

             if (page != null) {

                  return page;

            } else {

                 requestURI = requestURI.substring(0, requestURI.lastIndexOf(PATH_SEPERATOR));

            }

       }

   return null;

  }

   private String getErrorPathFromPage(final String errorCode, final Page resolvedPage) {

   if (resolvedPage.hasChild(errorCode)) {

   return resolvedPage.getPath() + PATH_SEPERATOR + errorCode;

  }

   if (resolvedPage.getParent() != null && resolvedPage.getDepth() >= MAX_DEPTH) {

   return getErrorPathFromPage(errorCode, resolvedPage.getParent());

  }

   return null;

  }

   public String getPagePath() {

        return pagePath;

  }

}

Step - 2

ResponseStatus.java

import com.adobe.cq.sightly.WCMUsePojo;

public class ResponseStatus extends WCMUsePojo {

    @Override

    public void activate() throws Exception {

        getResponse().setStatus(404);

    }

}

Step - 3

Exception.html

<sly data-sly-use.responseStatus="apps.sling.servlet.errorhandler.ResponseStatus">

<sly data-sly-use.errorPage="${'com.aem.test.ErrorHandlerRequestModel'@ errorCode='500'}"/>

<sly data-sly-resource="${errorPage.pagePath}.html"/>

</sly>

Step - 4

404.html

<sly data-sly-use.responseStatus="apps.sling.servlet.errorhandler.ResponseStatus">

    <sly data-sly-use.errorPage="${'com.aem.test.ErrorHandlerRequestModel'@ errorCode='404'}"/>

    <sly data-sly-resource="${errorPage.pagePath}.html"/>

</sly>

Screenshot for error handler

Overlay the eror handler from libs.

1758434_pastedImage_9.png

Step - 5

Create 404 and 500 pages under content/***/en/

1758437_pastedImage_26.png

Output-1

1758435_pastedImage_12.png

Output-2

1758436_pastedImage_15.png

Please help me to achieve this

Thanks,

Kiran

Message was edited by: Kiran veeranki

Accepted Solutions (1)

Accepted Solutions (1)

Avatar

Avatar

Jörg_Hoh

Employee

Total Posts

3.0K

Likes

911

Correct Answer

1.0K

Avatar

Jörg_Hoh

Employee

Total Posts

3.0K

Likes

911

Correct Answer

1.0K
Jörg_Hoh
Employee

24-05-2019

Have you already checked Error Page Handler ?

Answers (4)

Answers (4)

Avatar

Avatar

webcoholic

Avatar

webcoholic

webcoholic

29-05-2019

For Project level you can create custom error pages as per your project and configure at root level .Also you may need to configure the settings at dispatcher level.

Reference: http://www.aemcq5tutorials.com/tutorials/adobe-aem-cq5-tutorials/custom-error-pages-acs-commons-erro...

https://www.albinsblog.com/2015/03/how-to-customizeconfigure-404-error.html#.XO9cnYgzbIU

Above links are of previous versions but might help you to get some idea for implementation in 6.4 version

Avatar

Avatar

kiranv40650953

Avatar

kiranv40650953

kiranv40650953

29-05-2019

Hi Webcoholic,

I have already gone through this link and it is for global error handling which is working fine for me.

I need specific project level error handling.

Thanks,

Kiran

Avatar

Avatar

kiranv40650953

Avatar

kiranv40650953

kiranv40650953

28-05-2019

Hi Joerg,

Sorry for late response.I have gone through the above url, but I need to implement my custom error handler.

Can you help me to achieve this?

Thanks,

Kiran