All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jrouter.servlet.ObjectHandlerActionFactory Maven / Gradle / Ivy

package jrouter.servlet;

import java.util.Map;
import jrouter.ActionInvocation;
import jrouter.impl.ResultTypeProxy;
import jrouter.util.MethodUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 提供非{@code String}类型的结果类型处理,
 * 及可配置的类型{@code Class} -> 结果类型{@link ResultTypeProxy}映射。
 */
public class ObjectHandlerActionFactory extends ServletActionFactory.DefaultServletActionFactory {

    /** 日志 */
    private static final Logger LOG = LoggerFactory.getLogger(ObjectHandlerActionFactory.class);

    /* default object handler */
    private ResultTypeProxy defaultObjectHandler;

    /**
     * 根据指定的键值映射构造初始化数据的ObjectHandlerActionFactory对象。
     *
     * @param properties 指定的初始化数据键值映射。
     */
    public ObjectHandlerActionFactory(Map properties) {
        super(properties);
    }

    /**
     * Object class to ResultType mapping.
     *
     * 完全类型匹配,不考虑父子类继承等。
     */
    private Map objectResultTypes;

    @Override
    protected Object invokeObjectResult(ActionInvocation invocation, Object res) {
        ResultTypeProxy resultType = null;
        if (res != null && (resultType = objectResultTypes.get(res.getClass())) != null) {
            return MethodUtil.invoke(resultType, invocation);
        }
        return MethodUtil.invoke(defaultObjectHandler, invocation);
    }

    @Override
    protected Object invokeUndefinedResult(ActionInvocation invocation, String resInfo) {
        LOG.debug("Invoking undefined String Result [{}] at {}, use defaultObjectHandler [{}] ",
                resInfo, invocation.getActionProxy().getMethodInfo(), defaultObjectHandler);
        return MethodUtil.invoke(defaultObjectHandler, invocation);
    }

    /**
     * 设置默认非{@code String}类型对象的结果类型处理对象。
     * 注意即使设置了{@code String}类型的对象也并不会调用invokeObjectResult方法。
     *
     * @see #invokeObjectResult(jrouter.ActionInvocation, java.lang.Object)
     *
     * @param defaultObjectHandler 非{@code String}对象的结果类型处理对象。
     */
    public void setDefaultObjectHandler(ResultTypeProxy defaultObjectHandler) {
        this.defaultObjectHandler = defaultObjectHandler;
    }

    /**
     * 设置(结果对象的类型:结果类型对象)的映射关系。
     *
     * @param objectResultTypes (结果对象的类型:结果类型对象)的映射关系。
     */
    public void setObjectResultTypes(Map objectResultTypes) {
        this.objectResultTypes = objectResultTypes;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy