【问题标题】:Primefaces remotecommand action called only oncePrimefaces 远程命令操作仅调用一次
【发布时间】:2013-07-16 09:10:50
【问题描述】:

我有

<p:remoteCommand name="updateSelectedTarget" update="partToUpdate" actionListener="#{bean.onSelectedTarget}"/>

bean.java

public void onSelectedTarget() {
    System.out.println("here");
}

使用此配置,操作只会触发一次。我需要使用 actionListener 还是 action?和remoteCommand的进程参数有关系吗?

我只想补充一点,它以前可以工作。我只是更改了下面的更新部分

<h:panelGroup id="partToUpdate" layout="block">
    <p:panelGrid rendered="#{bean.selectedTarget == null ? false : true}">
        ...
        <h:selectOneMenu value="#{bean.stuffID}">
            ...
        </h:selectOneMenu>
        ...
    </p:panelGrid>
</h:panelGroup>

在只有一个 ID 之前 selectOneMenu

<h:selectOneMenu value="#{bean.stuffID}">

现在我有了对象

<h:selectOneMenu value="#{bean.stuff}">

【问题讨论】:

  • 我很确定使用带有 selectOneMenu 的转换器会有一些问题,但我无法使其工作。
  • remoteCommand 实际上应该做什么?您在 xhtml 中的哪个位置定义 remoteCommand?您是否收到任何错误(JavaScript 或 Java)?你能在浏览器网络日志中看到一个 ajax 请求吗?
  • remoteCommand 应该更新我的页面以显示或不显示页面的一部分。因此,该操作更改了我的 bean 的属性,并且我的页面有一个组件,该组件仅在此属性为 true 时才呈现。 remoteCommand 在页面末尾定义,我在 chrome 的控制台中没有 Java 错误或 Javascripts 错误。

标签: jsf primefaces


【解决方案1】:

java.lang.ClassCastException 来自该行

<f:selectItem itemLabel="None" itemValue="null" />

你能验证一下吗

【讨论】:

  • 不.. 没有。如果转换器未被识别,我必须在转换本身上。
  • 事实上你是对的!但是我也遇到了这个问题,ItemValue 必须是一个对象而不是 Id &lt;f:selectItems value="#{bean.allusers}" var="user" itemValue="#{user}" itemLabel="#{user.name}"/&gt; 最后一件事是如果我不能这样设置,如何设置默认的空值?
  • 因为 &lt;f:selectItem itemLabel="None" noSelectionOption="true"&gt;&lt;f:selectItem itemLabel="None" itemValue="#{null}" /&gt; 给了我一个 NullPointerException
【解决方案2】:
@FacesConverter("user")
public class UserConverter implements Converter{

    private List<User> users;

    public UserConverter(){
        this.users = myController.getAllUsers();
    }

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return this.getUser(value);
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((User) value).getId()).toString();
    }


    public User getUser(String id) {
        Iterator<User> iterator = this.users.iterator();
        while(iterator.hasNext()) {
           User user = iterator.next();

           if(user.getId() == Integer.valueOf(id)) {
               return user;
           }
        }
        return null;
    }
}

我认为我的转换器很好,因为我在其他地方使用它。 也许错误是如何将它与 h:selectOneMenu 一起使用

我有这个

<h:selectOneMenu value="#{bean.selectedUser}">
    <f:selectItem itemLabel="None" itemValue="null" />
    <f:selectItems value="#{bean.allusers}" var="user" itemValue="#{user.id}" itemLabel="#{user.name}"/>
    <f:converter converterId="user"/>
</h:selectOneMenu>

【讨论】:

  • 有了这个我有这个错误juil. 16, 2013 11:57:20 AM com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit SEVERE: java.lang.ClassCastException: java.lang.String cannot be cast to com.dto.User
【解决方案3】:

所以总结一下,我将 selectOneMenu 更改为

<h:selectOneMenu value="#{bean.selectedUser}">
    <f:selectItem itemLabel="None" itemValue="#{null}" />
    <f:selectItems value="#{bean.allusers}" var="user" itemValue="#{user}" itemLabel="#{user.name}"/>
    <f:converter converterId="user"/>
</h:selectOneMenu>

在我的转换器中

public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if(!StringUtils.isInteger(value)) {
        return null;
    }
    return this.getUser(value);
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
    if(value == null) {
        return null;
    }
    return String.valueOf(((User) value).getId()).toString();
}

使用下面的方法,因为我正在寻找 id 并且 getAsObject 值返回标签“None”

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    }
    return true;
}

问题解决了。 谢谢

编辑

不要忘记在 User 类中添加 equals 覆盖方法。

【讨论】:

    【解决方案4】:

    这种情况在我身上发生过很多次,我发现问题来自调用当前页面的上一页

    【讨论】:

    • 感谢您的帮助,但我真的认为现在是关于 selectOneMenu 因为当我删除它时,会调用该操作。
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多