当前位置: 首页 > 知识库问答 >
问题:

Primefaces selectOneMenu listener未使用字符串以外的对象调用[duplicate]

幸弘光
2023-03-14

我正在使用JSF2.0和Primefaces 3.2实现一个webapp。我注意到了一个意想不到的行为:我有一个selectOneMenu和一个commandButton,如下所示

<p:selectOneMenu id="selsel" value="#{bean.myObj}">
  <f:selectItems value="#{bean.myObjList}" />
</p:selectOneMenu>
<p:commandButton id="btnid" value="Ok" actionListener="#{bean.updateSelectValues()}" />

如果myObj不是String,则不会调用updateSelectValues方法。我根本看不到任何异常或错误,只是没有调用它。下面是支持bean:

private List<MyObj> myObjList;
private MyObj myObj;
// getters and setters

public void updateSelectValues() {
  System.out.println(this.myObj);
}

myObj的代码:

public class MyObj implements Serializable {

  private static final long serialVersionUID = 1L;

  private String param1;
  private int param2;

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("MyObj [param1=");
    builder.append(this.param1);
    builder.append(", param2=");
    builder.append(this.param2);
    builder.append("]");
    return builder.toString();
  }

}

共有1个答案

陆承宣
2023-03-14

这是因为HTML和HTTP不理解Java对象。当JSF生成HTML时,所有Java对象都会转换为字符串。当提交的表单数据被JSF处理时,所有的HTTP请求参数String都应该被转换回Java对象。

至于您的具体问题,如果您添加了

您需要创建一个自定义的转换器,它可以在MyObj及其唯一的字符串表示之间进行转换。例如:

@FacesConverter(forClass=MyObj.class)
public class MyObjConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object valueToRender) {
        // Convert MyObj to its unique String representation.
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        // Convert String to MyObj.
    }

}

通常这些对象已经通过它们的ID存储在某些数据库或映射中。然后,您可以准确地使用该ID作为唯一的String表示。

 类似资料:
  • 我正在尝试将json解析为java。 根据jsonlint,以下字符串是有效的json。com公司 我试图将它解析成一个对象,我得到了以下错误。"预期BEGIN_OBJECT但BEGIN_ARRAY在第1行第2列" BoxSearch由此组成。 框是定义相同的纬度对象和经度对象。 我可以将更高级别的属性(lat1、lat2、long1和long2)解析为一个更简单的BoxSearch对象,该对象只

  • 问题内容: 如何从字符串中删除除数字以外的所有字符? 问题答案: 在Python 2. *中,到目前为止最快的方法是: 生成一个转换表(长度为256的字符串),在这种情况下,该转换表与(更快地制作;-)相同。应用转换表(这里无关紧要,因为本质上是指身份),并删除第二个参数(关键部分)中存在的字符。 在Unicode字符串(和Python 3中的字符串)上的工作方式大不相同-我 确实 希望指出问题是

  • 问题 你有一个字符串形式的方法名称,想通过它调用某个对象的对应方法。 解决方案 最简单的情况,可以使用 getattr() : import math class Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return 'P

  • 问题内容: 我想通过看起来像这样的ORM运行django更新: 这导致MySQL引发异常。无论如何,不​​编写原始SQL就能做到这一点? 问题答案: 发生的事情是Django正在将“ +”传递给SQL-但是SQL不允许将“ +”用于串联,因此它尝试进行数字加法。如果您使用整数代替“字符串”,那么它确实可以将的整数值添加到变量中,因此可以正常工作。 这是否是bug尚有争议。查找查询中对象的文档说明:

  • 当我们使用 String 文字创建字符串对象时,会调用字符串类的哪个构造函数。 示例: 在这种情况下,string类的哪个构造函数get?

  • 我试图在Windows控制台应用程序中下载azure Blob。当我构建和调试应用程序时,我的azure连接字符串引发了一个异常。这个字符串在我的其他ASP.NET应用程序中工作得很好。