Jsf javax.faces.convert.Converter.getAsObject是否应该修改传递的UIComponent?

Jsf javax.faces.convert.Converter.getAsObject是否应该修改传递的UIComponent?,jsf,converter,Jsf,Converter,在遗留代码库中,我遇到了以下问题: @javax.faces.convert.FacesConverter(forClass = java.lang.String.class) public class WhitespaceToNullConverter implements Converter { @Override public Object getAsObject(FacesContext facesContext, UIComponent c, String value)

在遗留代码库中,我遇到了以下问题:

@javax.faces.convert.FacesConverter(forClass = java.lang.String.class)
public class WhitespaceToNullConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent c, String value) {
        if (value == null || value.trim().isEmpty()) {
            if (c instanceof EditableValueHolder) {
                ((EditableValueHolder) c).setSubmittedValue(null);
            }
            return null;
        }
        return value;
    }

    // ...
}
首先,传递的
UIComponent
是否总是
EditableValueHolder
?需要那张支票吗

其次,
Converter
是否应该更改调用它的
ui组件
?这对我来说似乎很奇怪,假设组件的值可能用于填充
UIComponent

政府没有就此发表任何声明

首先,传递的UIComponent不总是EditableValueHolder吗

通常,只有当JSF需要将提交的值转换为模型值时,才会调用
getAsObject()
。通常,这只在
UIInput#validate()
中调用。和
UIInput
实现
EditableValueHolder
。因此,假设在正常情况下,这个具体问题的答案是“是”


需要那张支票吗

不,但这也不是一个“坏习惯”。它很可能是由一个防御性的程序员编写的,他只是想避免当一个人滥用转换器来达到它不是为之设计的目的时出现问题;)


第二,转换器是否应该更改它所调用的UIComponent

取决于变更的目的。通常情况下,从用户代码对JSF组件树进行编程操作是一种糟糕的做法,但有时根本没有其他方法,因此您必须进行破解


这对我来说似乎很奇怪,假设组件的值可能用于填充UIComponent

该特定转换器解决了以下相关问题中描述的两个独立问题:

这里唯一奇怪的是,第一个问题的
setSubmittedValue(null)
解决方案是特定于JSF 1.x的,而应用程序显然在使用JSF 2.x,这可以从
@FacesConverter
的存在中得到证明。在以前的JSF1.x到2.x迁移过程中,它很可能被忽略。在JSF 2.x中,此特定转换器的
setSubmittedValue(null)
任务可以完全由以下上下文参数替换:

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

javax.faces.explait_EMPTY_STRING_SUBMITTED_VALUES_为_NULL
真的
这将使转换器不再看起来像黑客

另见: