Websphere commerce 如果产品不可用,则从CustomProductDisplayCmd重定向到404页

Websphere commerce 如果产品不可用,则从CustomProductDisplayCmd重定向到404页,websphere-commerce,Websphere Commerce,我的ProductDisplayCmd的自定义实现如下所示 public void performExecute( ) throws ECException { super.performExecute(); (my code here) 现在,如果某个产品不可用,super会抛出一个ECApplicationException,并显示以下消息: com.ibm.commerce.exception.ECApplicationException:目录条目 编号“253739”和

我的ProductDisplayCmd的自定义实现如下所示

public void performExecute( ) throws ECException {
    super.performExecute();
    (my code here)
现在,如果某个产品不可用,super会抛出一个ECApplicationException,并显示以下消息:

com.ibm.commerce.exception.ECApplicationException:目录条目 编号“253739”和零件号“9788703055992”对于 现行合同

有了一个支持SEO的URL,我会被重定向到我们的自定义404页面(“哎呀,对不起,那个产品不再可用了。试试我们的一个绝妙的替代品…”)

使用旧式的URL,我会得到一个错误页面,原因是出现了一个未捕获的异常


由于我可以捕捉到异常,我想我可以选择手动重定向到404页面,但这就是方法吗?特别是:异常类型似乎没有确切地告诉我什么是错误的,因此我可能会意外地从另一种错误中生成404。

我的结果是:从super捕获异常,然后确定引发异常的原因是否是产品不可用。如果是,则重定向到404页面,否则重新抛出异常

实施:

public void performExecute( ) throws ECException {
try {
    super.performExecute();
} catch (final ECApplicationException e) {
    // Let's see if the problem is something that should really be causing a redirect
    makeProductHelperAndRedirectTo404IfProductNotAvailable(e);
    // If we get here, noting else was thrown
    log.error("The reason super.performExecute threw an ECException is unknown and so we can't recover. Re-throwing it.");
    throw e;
}
…并在MakeProductBla方法中:

private ProductDataHelper makeProductHelperAndRedirectTo404IfProductNotAvailable(final ECException cause) throws ECSystemException,
        ECApplicationException {
    final ProductDataHelper productHelper;
    try {
        log.trace("Trying to determine if the reason super.performExecute threw an ECException is that the product is unavailable in the store. The execption is attached to this logline.", cause);
        productHelper = makeProductHelper(getProductId());
        if (productHelper != null) {
            if (!productHelper.isActiveInClub()) {
                log.trace("Decided that the reason super.performExecute threw an ECException is that the product is unavailable in the store. The execption is attached to this logline. NB! That exception is DISCARDED", cause);
                final String pn = productHelper.getISBN();
                final ECApplicationException systemException = new ECApplicationException(ECMessage._ERR_PROD_NOT_EXISTING, this.getClass().getName(), "productIsPublished", new Object[]{ pn });
                systemException.setErrorTaskName("ProductDisplayErrorView");
                throw systemException;
            }
        }
        return productHelper;
    } catch (RemoteException e) {
        log.error("I was trying to determine if the reason super.performExecute threw an ECException is that the product is unavailable in the store. The original ECException is attached to this logline. NB! That exception is DISCARDED", cause);
        throw new ECSystemException(ECMessage._ERR_GENERIC, super.getClass().getName(), "performExecute",ECMessageHelper.generateMsgParms(e.getMessage()), e);
    } catch (NamingException e) {
        log.error("I was trying to determine if the reason super.performExecute threw an ECException is that the product is unavailable in the store. The original ECException is attached to this logline. NB! That exception is DISCARDED", cause);
        throw new ECSystemException(ECMessage._ERR_GENERIC, super.getClass().getName(), "performExecute",ECMessageHelper.generateMsgParms(e.getMessage()), e);
    } catch (FinderException e) {
        log.error("I was trying to determine if the reason super.performExecute threw an ECException is that the product is unavailable in the store. The original ECException is attached to this logline. NB! That exception is DISCARDED", cause);
        throw new ECSystemException(ECMessage._ERR_GENERIC, super.getClass().getName(), "performExecute",ECMessageHelper.generateMsgParms(e.getMessage()), e);
    } catch (CreateException e) {
        log.error("I was trying to determine if the reason super.performExecute threw an ECException is that the product is unavailable in the store. The original ECException is attached to this logline. NB! That exception is DISCARDED", cause);
        throw new ECSystemException(ECMessage._ERR_GENERIC, super.getClass().getName(), "performExecute",ECMessageHelper.generateMsgParms(e.getMessage()), e);
    }
}