【问题标题】:Jsf validation error (shown by h:message) while updating Model, why?更新模型时 Jsf 验证错误(由 h:message 显示),为什么?
【发布时间】:2011-03-03 15:10:32
【问题描述】:

列表.xhtml:

 <h:selectOneMenu value="#{produtosController.selected.codigo}">
    <f:selectItems value="#{produtosController.itemsAvailableSelectOne}"/>
 </h:selectOneMenu>
 <h:commandButton action="#{produtosController.createByCodigos}" value="Buscar" />  

控制器类方法:

 public String createByCodigos(){
    items = new ListDataModel(ejbFacade.findByCodigos(current.getCodigo()));
    updateCurrentItem();
    return "List";
}  

外观类方法:

 public List<Produtos> findByCodigos(Integer codigo){
    Query q = em.createNamedQuery("Produtos.findByCodigo");
    q.setParameter("codigo", codigo);
    return q.getResultList();
}

Bean类查询:

 @NamedQuery(name = "Produtos.findByCodigo", query = "SELECT p FROM Produtos p WHERE p.codigo = :codigo")

 @Column(name = "codigo")
 private Integer codigo;

【问题讨论】:

  • 请粘贴准确信息。是“值无效”吗?
  • 对不起 j_idt12:j_idt28: 验证错误: 英文中的 Valor no es Correcto j_idt12:j_idt28: 验证错误: 错误值或值错误。谢谢

标签: jsf ejb eclipselink


【解决方案1】:

从 cmets 得知是Validation Error: Value not valid

这基本上意味着当前选定的项目不是当前请求中的选定项目列表的一部分。看起来 item 值是非标准类型(Produtos 也许?)。出现此问题的可能原因有以下三种:

  1. 表示项目值的类型的equals()hashCode() 未实现或实现不正确。要解决此问题,请让 IDE 自动生成它或阅读 javadocs

  2. 使用了自定义转换器,getAsObject() 返回了错误的值。要解决此问题,请确保它返回的值与通过getAsString() 传入的值完全相同

  3. 该 bean 是请求范围的,当您提交表单时,选择项列表与初始请求中的不同。要解决此问题,您需要确保在后续请求中保留相同的列表。如果您已经在 J​​SF 2.0 上,则声明 bean @ViewScoped 将修复它。如果您使用的是 JSF 1.x,那么您需要将 bean 置于会话范围内或在 bean 构造函数中进行列表加载。

【讨论】:

  • 我在后续问题中发布了我的发现
  • BalusC 我知道我的要求太多了,但这是我的第一个网络应用程序,我真的需要你的帮助(我让它工作了,但最后的更改毁了一切,我不知道为什么)
  • 抱歉,非 SSCCE 格式的非英语和非直观代码让人难以理解发生了什么。我至少指出了可能的原因。调试和调查它们取决于您。也许this article 更有用。暂时不要修改您的代码,只需开始清理以了解情况,然后在此基础上进一步构建。
  • Balus I can debbug 原因在启动 glashfish 时抛出以下错误:WEB0517 无法恢复 Web 模块的会话 插件插入失败:无法从以前的部署中找到插件 原因 HTTP 会话应该在Web 模块的重新部署未能恢复(反序列化)。如果用作会话属性的应用程序类发生了不兼容的更改,则可能会发生这种情况。我评论了(//)所有更改,但加载时仍然抛出异常,我该怎么办?
【解决方案2】:

这是一个:

    public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
        if (object == null) {
            return null;
        }
        if (object instanceof Produtos) {
            Produtos o = (Produtos) object;
            return getStringKey(o.getId());
        } else {
            throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: "+ProdutosController.class.getName());
        }

这是另一个:

    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
        if (value == null || value.length() == 0) {
            return null;
        }
        ProdutosController controller = (ProdutosController)facesContext.getApplication().getELResolver().
                getValue(facesContext.getELContext(), null, "produtosController");
        return controller.ejbFacade.find(getKey(value));
    }

这是失去价值的地方吗:getValue(facesContext.getELContext() null, "produtosController");?

【讨论】:

    【解决方案3】:

    非常感谢balusc,我遇到了同样的问题,我已经解决了。

    1. bean 是请求范围的,当您提交表单时,选择项列表与初始请求中的不同。要解决此问题,您需要确保在后续请求中保留相同的列表。如果您已经在 J​​SF 2.0 上,则声明 bean @ViewScoped 会修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 2012-09-30
      相关资源
      最近更新 更多