JSF转换器验证错误:值对SelectOneMenu UIComponent无效

时间:2011-08-20 12:06:34

标签: jsf jpa

我在requestScope中使用managedBean userHome ,其中实体'user'将继续存在。 用户具有以ManyToOne关系映射的leader列。我的代码看起来像这样

@ManagedBean
@RequestScoped
public class UserHome {
    private User user = new User();
        // Getters and Setters

    private List<SelectItem> selectItems = new ArrayList<SelectItem>();

    public UserHome() {
        for(User user: availableLeaders) {
            selectItems.add(new SelectItem(user.getName(), user));
        }
    }

    public void persis();
}

User.java

public class User {
    @Id
    @Column
    private Integer id;

    @Column
    privat String name;

    @ManyToOne
    private User leader;
}

我试图通过h:selectOneMenu像这样

来获得这位领导者的价值
<h:selectOneMenu value="#{userHome.user.leader}" converter="userConverter">
    <f:selectItems value="#{userHome.selectItems}"/>
</h:selectOneMenu>

我的转换器看起来像这样

@FacesConverter(forClass = User.class, value="userConverter")
public class UserConverter implements Converter {

    private  Map<String, User> userValues = new HashMap<String, User>();

    public UserConverter() {
        init();
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        return userValues.get(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        System.out.println("RAJASEKARAN "+value);
        return ((User)value).getName();
    }

    public void init() {
        UserHome userHome = new UserHome();
        for(User user:userHome.availableLeaders()) {
            userValues.put(user.getName(), user);
        }
    }
}

尝试保存用户时我收到错误UserEdit:j_idt18:验证错误:值无效

2 个答案:

答案 0 :(得分:14)

添加到BalusC的答案:在回发之后,您需要确保用户实例与用于呈现选择项的用户实例完全相同,或者您为User类实现了等号。

代码没有显示availableLeaders的来源,但是如果这是从按需提取的数据库中提取的,那么转换器将不会转换为JSF通过列表中的完全相同的对象实例#{userHome.selectItems}

转换后,JSF将使用equals()方法检查是否可以在该列表中找到转换后的实例。

答案 1 :(得分:8)

你以错误的方式构建了SelectItem。根据{{​​3}},第一个参数应表示项目值(将被转换和提交),第二个参数应表示项目标签(将在列表中显示)。但是你反过来指定了它们。

相应修复:

selectItems.add(new SelectItem(user, user.getName()));

如果仍然无法解决问题,那么这意味着equals()类的User方法没有(正确)实现。转换后,JSF将使用它来验证列表中任何项目值的选定User


对具体问题

无关,知道JSF2中的<f:selectItems>为您提供构建列表的可能性,而无需构建{{1}列表可能会有用。手动。这是一个完全相同的例子:

SelectItem

这允许你摆脱额外的<f:selectItems value="#{userHome.availableLeaders}" var="user" itemValue="#{user}" itemLabel="#{user.name}" /> 属性和bean构造函数中的循环。