禁用大型项目​​中的组件

时间:2015-02-17 11:53:21

标签: jsf jsf-2 jsf-2.2

有很多开发人员和大量的青少年我想禁用某些组件,例如<p:spacer>,禁止使用组件来解决html / css问题。我想基本上将omnifaces / primefaces / richfaces等库的可用组件限制为白名单/黑名单。

对于像omnifaces这样的库,这是一个合理的功能请求,还是难以构建/本地化?

2 个答案:

答案 0 :(得分:4)

基本上,您可以通过提供自定义Application实施(基于ApplicationWrapper)来实现此目的,其中您覆盖the desired createComponent() method并投掷,例如当传递列入黑名单的组件类型和/或渲染器类型时,IllegalArgumentException

这是一个启动示例:

public class YourApplication extends ApplicationWrapper {

    private static final Set<String> BLACKLISTED_COMPONENT_TYPES = unmodifiableSet(new HashSet<>(asList(
        "org.primefaces.component.Spacer",
        "com.example.SomeComponentType",
        "com.example.OtherComponentType"
        // Etc..
    )));

    private final Application wrapped;

    public YourApplication(Application wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public UIComponent createComponent(FacesContext context, String componentType, String rendererType) {
        if (BLACKLISTED_COMPONENT_TYPES.contains(componentType)) {
            throw new IllegalArgumentException("You are not allowed to use this component.");
        }

        return super.createComponent(context, componentType, rendererType);
    }

    @Override
    public Application getWrapped() {
        return wrapped;
    }

}

您可以使用此工厂运行它:

public class YourApplicationFactory extends ApplicationFactory {

    private final ApplicationFactory wrapped;

    public YourApplicationFactory(ApplicationFactory wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public Application getApplication() {
        return new YourApplication(wrapped.getApplication());
    }

    @Override
    public void setApplication(Application application) {
        wrapped.setApplication(application);
    }

}

faces-config.xml注册的内容如下:

<factory>
    <application-factory>com.example.YourApplicationFactory</application-factory>
</factory>

答案 1 :(得分:1)

您可以使用jsf的标记文件功能。您将为要使用的每个组件声明标记文件。之后,您的团队将只在您的项目中使用这些标记文件。