尝试将多值字段绑定到 XPages 中的托管 Java Bean



我开发了一个简单的"配置"自定义控件,该控件将多个字段绑定到托管的Java Bean。除了多值字段之外,一切都运行良好。如果我在字段中提供多个值,则效果很好。如果我只提供一个值,它会失败。

爪哇豆包含...

private Vector<String> acctTypes;

。和getters/setters...

public void setAcctTypes ( Vector<String> content ) {this.acctTypes = content;} 
public Vector<String> getAcctTypes() {return acctTypes;}

在自定义控件中,我将字段绑定到 bean...

<xp:inputText id="inputAcctTypes" title="Account Types" value="#{config.acctTypes}"
multipleTrim="true" multipleSeparator=";">
</xp:inputText>

如果在字段中输入单个值,则完全失败。我也尝试将其设置为文本区域,但没有成功...

<xp:inputTextarea id="inputAcctTypes" title="Account Types"
value="#{config.acctTypes}" rows="5" multipleTrim="true">
<xp:this.multipleSeparator><![CDATA[#{javascript:"n"}]]></xp:this.multipleSeparator>
</xp:inputTextarea>

请原谅我的无知...我知道在多值字段中输入单个值时 XPages 会返回一个字符串值,但对于我的生活,我无法弄清楚在绑定到托管 Bean 时如何适应它。

谁能告诉我我在这里出了问题?

Doh!

我一直在寻找解决方案,然后发生了汤米的这篇出色的帖子,该帖子在发布我的问题后立即解释了该技术......

http://dontpanic82.blogspot.com.au/2012/06/multi-value-fields-and-beans-in-xpages.html

希望这可以帮助发现自己处于类似困境的其他人。我改变了我的吸盘手/二传手...

public void setNotifications ( Object content ) {this.notifications = translateToVector(content);} 
public Object getNotifications() {return notifications;}

。然后添加了必要的翻译功能...

private Vector<String> translateToVector( Object object ){
    if( object instanceof String ){
             Vector<String> list = new Vector<String>();
             list.add( (String) object );
             return list;
         }
         if( object instanceof List ){
             return (Vector<String>)object;
         }
         return null;
}

使用转换器:

<xp:inputText id="inputText1" value="#{config.acctTypes}">
    <xp:this.converter>
        <xp:convertList delimiter=";" />
    </xp:this.converter>
</xp:inputText>

框架提供的转换器并不"完美",因为它会将输入空值转换为 1 值List该值为 "。从某种角度来看,这是有道理的,但可能不是你想要的。否则,您可以扩展或创建自己的转换器以获得所需的内容。

此方法是最佳做法。您希望控制器接收"处理"值,而不是将方法参数更改为无限量对象,然后尝试相应地解析它。尽可能多地,Bean 应该对数据如何从 POST 阶段转换是不可知的。你通过转换器实现这一目标,这是他们的工作。

好处有几个:你有更干净的代码,你可以在其他地方获取(使用(值,而不必在需要时强制转换它(在列表的情况下禁止警告(。

最新更新