Отключить включение jsf f: convertDateTime

У меня есть две кнопки, в одном мне нужно <f:convertDateTime> работать, но в другом мне нужно отключить <f:convertDateTime> при нажатии кнопки.

Я попробовал атрибуты rendered и disabled, но это не сработало, это была моя ошибка, поскольку она недоступна в соответствии с документами API.

Кроме того, существует ли способ переопределить класс javax.faces.converter.DateTimeConverter таким образом, что всякий раз, когда f:convertDateTime запускается, мой класс будет вызван?

Ответ 1

Я попробовал обработанные и отключенные атрибуты, но это не сработало, это была моя ошибка, поскольку она недоступна в документах API.

В самом деле, это поведение не поддерживается. Однако, что касается возможного решения, вы в основном уже сами дали ответ:

Кроме того, существует ли способ переопределить класс javax.faces.converter.DateTimeConverter таким образом, что всякий раз, когда f:convertDateTime запускается, мой класс будет вызываться?

Это возможно и также решит вашу первоначальную проблему. Просто зарегистрируйте его как <converter> в faces-config.xml в точности тот же <converter-id> как <f:convertDateTime>.

<converter>
    <converter-id>javax.faces.DateTime</converter-id>
    <converter-class>com.example.YourDateTimeConverter</converter-class>
</converter>

В этом случае вы можете выполнить дополнительную условную проверку, например, проверить, нажата ли определенная кнопка, или если присутствует определенный параметр запроса или отсутствует. Если вы хотите продолжить задание по умолчанию <f:convertDateTime>, просто делегируйте super при условии, что ваш конвертер extends из DateTimeConverter.

например. в getAsObject():

public class YourDateTimeConverter extends DateTimeConverter {

    @Override
    public void getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        // ...

        if (yourCondition) {
            // Do your preferred way of conversion here.
            // ...
            return yourConvertedDateTime;
        } else {
            // Do nothing. Just let default f:convertDateTime do its job.
            return super.getAsObject(context, component, submittedValue);
        }
    }

    // ...
}

Ответ 2

Я предполагаю, что у вас есть текст, отображаемый на основе нажатия кнопки (исправьте меня, если я ошибаюсь). Так должно быть что-то вроде этого:

<h:commandButton value="Convert" action="#{bean.doBtnConvert}" />

<h:commandButton value="Don't convert" action="#{bean.doBtnDontConvert}" />

<h:panelGroup id="pgText">
    <h:outputText value="#{bean.someDateTime}" rendered="#{bean.convert}">
        <f:convertDateTime pattern="dd.MM.yyyy HH:mm:ss" />
    </h:outputText>

    <h:outputText value="#{bean.someDateTime}" rendered="#{not bean.convert}"> />
</h:panelGroup>

И в bean у вас есть следующее поле и методы:

private Date someDate;
private boolean convert;

public String doBtnConvert(){
    setConvert(true);
    String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
    return viewId + "?faces-redirect=true";
}

public String doBtnDontConvert(){
    setConvert(false);
    String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
    return viewId + "?faces-redirect=true";
}

// getter and setter for 'someDate' and 'convert' fields