【问题标题】:Converter in p:selectOneMenup:selectOneMenu 中的转换器
【发布时间】:2012-10-18 03:47:08
【问题描述】:

我的转换器有问题 - 它停止工作并且什么也没发生。 我有实体类“组”:

@Entity
@Table(name="users_group")
public class Group implements Serializable {

    private int id;
    private String name;
    private boolean active = true;
    private String code;
    private List<User> users = new ArrayList<User>();

    // getters, setters

    @Override
    public String toString() {
        return "Group.id="+getId();
    }

    @Override
    public boolean equals(Object obj){
        System.out.println("OBJ :"+obj);
        if(obj == null )return false;
        if(obj instanceof String){
            if(obj.toString().equals(this.toString())){
                return true;
            }
        }
        if(obj instanceof Group){
            Group objGroup = (Group) obj;
            if(objGroup.getId() == this.getId()){
                System.out.println("EUREKA! Found");
                return true;
            }

        }
        return false;
    }
}

这是我的 jsf 视图代码:

<p:selectOneMenu id="group" value="#{priviligeMB.groupPrivilige.group}"  converter="#{groupConverter}" >  
                                <f:selectItems value="#{priviligeMB.groups}"  
                                    var="group" itemLabel="#{group.name}" itemValue="#{group}" />  
                    </p:selectOneMenu > 

当然还有 GroupConverter 类:

@Component("groupConverter")
public class GroupConverter implements Converter {

    @Autowired
    GroupService groupService;

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        // arg2 is "Group.id=x" where x is just an id, for example "Group.id=2"
        try {
            System.out.println("getasObj: "+arg2);
            return groupService.getGroupById(Integer.parseInt(arg2.split("=")[1]));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
       // arg2 is object with toString() method that prints: "Group.id=x"
        System.out.println("getAsString: "+arg2);
        return arg2.toString();
    }
}

这是我的日志:

> getAsString: Group.id=1 
> getAsString: Group.id=2 
> Hibernate: SELECT locale.code from messages_locale locale left join users_user u sers on
> users.locale_id = locale.id where users.username =? 
> getasObj: Group.id=1 
> Hibernate: select group0_.id as id0_0_, group0_.active as
> active0_0_, group0_.co de as code0_0_, group0_.name as name0_0_ from
> users_group group0_ where group0_. id=? 
> OBJ :Group.id=1 EUREKA! Found
> OBJ :Group.id=1 EUREKA! Found 
> OBJ :Group.id=2

然后……什么也没发生!没有错误,没有操作,没有页面重新加载,没有消息......

【问题讨论】:

  • “什么都没发生”到底是什么意思?支持 bean 中的值绑定计算为 null?选择菜单是空的?
  • 系统没有响应,好像我没有点击“保存”按钮,没有错误堆栈,没有重新加载页面。
  • 那你可能有转换错误。通过在您的页面上放置 &lt;h:messages/&gt; 并提交您的表单来确认这一点
  • 同样的问题 - 没有堆栈跟踪(对此非常愤怒)

标签: jsf primefaces converter selectonemenu


【解决方案1】:

我遇到了类似的问题,终于解决了。

在这种情况下,您需要确保“getAsObject”返回的对象可以匹配"#{priviligeMB.groups}"中的对象之一,这里“ma​​tch”表示同一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2013-07-10
    相关资源
    最近更新 更多