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

Trying to bind a multi-value field to a managed Java bean in XPages

我开发了一个简单的 'Configuration' 自定义控件,它有几个字段绑定到托管 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 returns 是一个字符串值,但对于我来说,我无法弄清楚如何在绑定到托管 bean 时适应这一点。

谁能告诉我哪里错了?

哎呀!

我一直在寻找解决方案,然后在 post 提出我的问题后发现了 Tommy 的这个优秀 post 解释了该技术...

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

希望这对发现自己处于类似困境中的其他人有所帮助。 我改变了我的 getters/setters...

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>

框架提供的转换器不是 "perfect",因为它将输入的空值转换为 1 值 List,其中该值为“”。从某种角度来看它是有道理的,但它可能不是你想要的。否则,您可以扩展或创建自己的转换器以获得您想要的。

此方法是最佳实践。您希望您的控制器接收 "treated" 值,而不是将您的方法参数更改为一个吃到饱的对象,然后尝试相应地解析它。 bean 应该尽可能不知道数据是如何从 POST 阶段转换的。您可以通过转换器实现这一点,这是他们的工作。

好处有几个:您拥有更简洁的代码,并且可以在其他地方获取(使用)该值,而无需在需要时随时转换它(在列表的情况下抑制警告)。