2

我已经在这里阅读了很多关于这个问题的问题,我可以向你保证,这不是 EQUALs 方法,而且,它不是 bean 范围的问题。所以,让我们看看发生了什么。

我有这个 selectOne,它正在“部分”工作

                <p:selectOneMenu id="acao" converter="#{acaoConverter}" value="#{prospectoRadarController.acaoSelecionada}">
                    <f:selectItem itemLabel="#{msg['label.selecione.item']}" itemValue="" />
                    <f:selectItems var="a" itemValue="#{a}" itemLabel="#{a.descricao}" value="#{acaoController.listarAcoesEmAberto()}" />
                </p:selectOneMenu>

所以我有'Acao'实体。所有实体都是完全有效的,因为选择的 HTML 也是正确的(值是实体的正确 ID)。

我导入的数据(使用 SQL 文件)检查最后两行:

            INSERT INTO com_acao VALUES (190, 0.00, '2012-12-31', '2012-12-31', '2012-12-31', 'SELECIONADOS 2012-1', 0, 1, 1);
            ALTER SEQUENCE com_acao_id_seq RESTART WITH 191;

好的,如果我插入一个新实体,它会正确插入,并使用正确的 ID,一切正常。

问题:在那个 SelectOneMenu 上,如果我选择一个与 SQL 文件一起导入的实体,它就可以工作。如果我选择一个使用系统保存的新实体,我会得到:

  javax.faces.component.UISelectOne.INVALID

验证错误。同样,等号并没有被打破。我最好的选择是这与 Hibernate 相关。但是....它是如何添加、过滤、搜索实体并且没有发生错误的?只有验证错误发生?:(

这是实体 ID 声明:

   public class Acao {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;

谢谢 !我的存储库是 Spring Data 的 PagingAndSorting 接口。我不知道这是否是相关信息...如果你们需要任何信息,请问!再次感谢!

更新 加载要在 SelectItems 上显示的“Acao”列表的方法:

public List<Acao> listarAcoesEmAberto() {
    return acaoService.listarAcoesEmAberto();
}

执行此查询:

@Query("select a from Acao a where a.dataFinal is null OR current_date() <= a.dataFinal")
public List<Acao> listarAcoesEmAberto();

更新 2转换器方法:

@SuppressWarnings("unchecked")
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
    if (arg2 == null || arg2.equals("")) {
        return null;
    }

    try {
        return baseService.findOne((PK) new SimpleTypeConverter().convertIfNecessary(arg2, ReflectUtil.getPrimaryKeyField(entityClass).getType()));
    } catch (TypeMismatchException e) {
        return null;
    }
}

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
    if (arg2 == null) {
        return "";
    }

    return arg2.toString();
}

注意:这是一个通用转换器。真正的转换器是:

@Component @Scope("request") public class AcaoConverter extends BaseConverter implements Serializable {

private static final long serialVersionUID = 1L;

@Autowired
public AcaoConverter(AcaoService acaoService) {
    super(acaoService, Acao.class); 
}

所以它对于所有实体都是相同的转换器。它有效。为什么不针对这种特殊情况?:(

更新 3让我们更好地看到问题......

这是从 sql 文件中导入的行: 一个

这是我使用该程序创建的一行: 2

这在数据库上是一样的(所以它被提交了): 3

这是选择: 4

的HTML: 5

成功案例(选择导入的行): 6

错误案例(选择创建的行): 7

更新 4哇!我用其他一些导入的实体进行了测试,并且......其中一些不起作用。所以,底线:新实体不起作用,一些导入的实体不起作用!查看数据库,它们都是很好的数据,没有丢失或违规。好诡异!

另一件事..使用 autoComplete 组件它可以工作!!!!(一切正常)

4

1 回答 1

0

出色地,

selectOneMenu 没有解决方案。所以我使用了带有下拉菜单的自动完成功能(true)。

它工作正常。

因此,这并不是真正的解决方案,而是一种解决方法。谢谢大家的帮助。

于 2013-02-04T15:20:00.577 回答