尝试将多值字段绑定到 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 阶段转换的。您可以通过转换器实现这一点,这是他们的工作。
好处有几个:您拥有更简洁的代码,并且可以在其他地方获取(使用)该值,而无需在需要时随时转换它(在列表的情况下抑制警告)。
我开发了一个简单的 '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 阶段转换的。您可以通过转换器实现这一点,这是他们的工作。
好处有几个:您拥有更简洁的代码,并且可以在其他地方获取(使用)该值,而无需在需要时随时转换它(在列表的情况下抑制警告)。