Search code examples
javaclassjsffaces-config

Class parameter in Faces Config


Is there a way to pass a class into a property as a Class object?

i.e.

    <managed-property>
        <property-name>clazz</property-name>
        <value>java.lang.Double.class</value>
    </managed-property>

Solution

  • No, there is no way. This is only possible if the class in question has a (default) no-arg constructor. The java.lang.Double doesn't have one. Also, in theory your construct is invalid. The following would have worked if you use a class with a (default) no-arg constructor at the place where java.lang.Double is been definied:

    <managed-bean>
        <managed-bean-name>bean</managed-bean-name>
        <managed-bean-class>mypackage.Bean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>clazz</property-name>
            <property-class>java.lang.Class</property-class>
            <value>#{clazz.class}</value>
        </managed-property>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>clazz</managed-bean-name>
        <managed-bean-class>java.lang.Double</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
    

    in combination with

    public class Bean {
        private Class<?> clazz; 
    
        public Class<?> getClazz() {
            return clazz;
        }
    
        public void setClazz(Class<?> clazz) {
            this.clazz = clazz;
        }
    }
    

    You really need to specify it as a String and make use of Class#forName() to obtain the java.lang.Class from it. Here's a kickoff example:

    <managed-bean>
        <managed-bean-name>bean</managed-bean-name>
        <managed-bean-class>mypackage.Bean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>className</property-name>
            <value>java.lang.Double</value>
        </managed-property>
    </managed-bean>
    

    in combination with

    public class Bean {
    
        private Class<?> clazz;
    
        public Class<?> getClazz() {
            return clazz;
        }
    
        public void setClassName(String name) {
            try {
                this.clazz = Class.forName(name);
            } catch (ClassNotFoundException e) {
                throw new IllegalArgumentException("Illegal class name.", e);
            }
        }
    
    }