Параметр класса в Faces Config

Есть ли способ передать класс в свойство как объект класса?

т.е.

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

2 ответа

Решение

Нет, нет пути. Это возможно только в том случае, если рассматриваемый класс имеет конструктор (по умолчанию) без аргументов. java.lang.Double не один Кроме того, в теории ваша конструкция недействительна. Следующее сработало бы, если бы вы использовали класс с конструктором (по умолчанию) без аргументов в месте, где java.lang.Double было определено:

<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>

в комбинации с

public class Bean {
    private Class<?> clazz; 

    public Class<?> getClazz() {
        return clazz;
    }

    public void setClazz(Class<?> clazz) {
        this.clazz = clazz;
    }
}

Вы действительно должны указать это как String и использовать Class#forName() чтобы получить java.lang.Class от него. Вот начальный пример:

<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>

в комбинации с

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);
        }
    }

}

Да. Но это будет реализовано как String. Вы можете превратить это в Class в вашем бобе, где это необходимо, используя Class.forName(clazz)

Вы можете попробовать использовать <property-class>java.lang.Class</property-class>, но я не уверен, что есть конвертер для этого встроенного

Другие вопросы по тегам