java - 错误的值被发送到转换器 JSF

标签 java jsf xhtml

使转换器、equals 和 JSF 代码正常工作的问题的最终解决方案。

Player 是一个具有一些属性的 Player bean。该服务访问播放器并将播放器信息写入数据库(除此之外:)

<h:selectOneListbox size="1" value="#{player}" 
                converter="playerConverter" id="playerList">
            <f:selectItems value="#{servicePlayer.allPlayers}"
             var="n"
             itemValue="#{n}"
             itemLabel="#{n.combinedName}"
             itemLabelEscaped="true"/>
            </h:selectOneListbox>

在服务播放器中

public List<Player> getAllPlayers() {

        if (factory == null) {
            factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        }

        EntityManager em = factory.createEntityManager();
        Query q = em.createQuery("select t from Player t");

        List<Player> players = q.getResultList();

.... 

@FacesConverter(value = "playerConverter")
public class PlayerConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null) {
            return null;
        }

        long idValue;
        try {
            idValue = Long.parseLong(value);
        }
        catch (NumberFormatException ex)
        {
            return null;
        }

        ServicePlayer servicePlayer = context.getApplication()
                .evaluateExpressionGet(context, "#{servicePlayer}",
                        ServicePlayer.class);
        Player player = servicePlayer.getPlayerByID(idValue);
        return player;

    }

    @Override
    public String getAsString(FacesContext context, 
                                  UIComponent component, Object value) {
        if (value == null || value.equals("")) {
            return "";
        } else {
            return String.valueOf(((Player)value).getStringID()); 
        }
    }

}

在播放器中

@Override
    public boolean equals(Object other) {
        return (id != null && other != null && getClass() == other.getClass())
             ? id.equals(((Player) other).getId())
             : (other == this);
    }

    @Override
    public int hashCode() {
        return (id != null) 
             ? (getClass().hashCode() + id.hashCode()) 
             : super.hashCode();
    }

最佳答案

getAsString 中,您返回一个 String 对象,而在 getAsObject 中,您试图将值解析为 Long: idValue = Long.parseLong(value); 这没有任何意义。

您应该在 getAsString 中返回正确的 id,以便您可以在 getAsObject 中获取它。

已更新

例如 您的 getAsString 方法应该如下所示:

public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
    if (value == null || value.equals("")) {
        return "";
    }
    else {
        return String.valueOf(((ServicePlayer) value).getId());
    }
}

关于java - 错误的值被发送到转换器 JSF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20652484/

相关文章:

java - 如何在 Spring REST Controller 中验证请求参数

java - 访问位于 Runnable run() hock 方法内的内部类中的变量

javascript - 为什么 JSF 提供文件扩展名为 .jsf 且 GET 参数 ln=js 的 JavaScript 资源?

jquery - 左侧为固定宽度 div,右侧为可变宽度 div

java - 当选择 jtextfield 或按钮时如何保持 jframe 的焦点

java - 查找子类方法的调用

jsf - 这个 faces-config.pageflow.xml 文件是从哪里来的?

java - 无法从上下文中将请求字符编码设置为 UTF-8

html - 使用 CSS 的表单字段灵活阴影

javascript - 当我输入更多文本时,如何让工具提示背景扩展或增长?