Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
titleSiteAwareExceptionMapping
linenumberstrue
collapsetrue
package info.magnolia.virtualuri.mapping;

import java.net.URI;
import java.util.Optional;

import javax.servlet.http.HttpServletRequest;

import info.magnolia.context.MgnlContext;
import info.magnolia.module.site.SiteManager;
import info.magnolia.objectfactory.Components;

public class SiteAwareExceptionMapping extends DefaultVirtualUriMapping {
    
    public static final String SERVLET_ERROR_REQUEST_URI_ATTRIBUTE_NAME = "javax.servlet.error.request_uri";
    
    private String siteName;
    
    @Override
    public Optional<Result> mapUri(URI uri) {
        
        HttpServletRequest request = MgnlContext.getWebContext().getRequest();
        Object errorRequestObject = request.getAttribute(SERVLET_ERROR_REQUEST_URI_ATTRIBUTE_NAME);
        if (errorRequestObject == null) {
            return Optional.empty(); 
        }
        
        String errorRequest = errorRequestObject.toString();
        String[] requestParts = errorRequest.split("/");
        
        if (requestParts.length >= 3) {
            errorRequest = "/" + requestParts[2] + "/"; // remove some parts due to Magnolia specific implementation
        }
        
        String requestedSite = Components.getComponent(SiteManager.class).getAssignedSite(request.getServerName(), errorRequest).getName();
        
        if (!siteName.equals(requestedSite)) {
            return Optional.empty(); 
        }
        
        return super.mapUri(uri);
    }

    public String getSiteName() {
        return siteName;
    }

    public void setSiteName(String siteName) {
        this.siteName = siteName;
    }
    
}


This source code code SiteAwareExceptionMapping.java is provided without any guarantee as a community creative & publicly available one. Please use it with cares and a bit or risks.

Deployment for light-dev and on Magnolia Cloud

Customers of Magnolia light-dev and Magnolia Cloud could also deploy a Java class into Magnolia using Groovy Classes follow similar to our guideline here Model Class

1._Create corresponding folder structure and a SiteAwareExceptionMapping file using Magnolia Groovy App as below image:

...

Code Block
titletravel-exception-mapping.yaml
class: "info.magnolia.virtualuri.mapping.SiteAwareExceptionMapping"
fromUri: "/customException"
toUri: "forwardredirect:/travel/exception"
siteName: "travel"

...

As you can easily find that we have this configuration point '/modules/mgnlsupport/virtualUriMappings/travel-exception-mapping@toUri' which has the value as 'forwardredirect:/travel/exception' then if you have another page somewhere for your site, you can easily change the page location from '/travel/exception' to your new one. The working mechanism is described in our official Virtual URI mapping function. 

...