JSF - SelectOneMenu验证失败(错误无效) - Hibernate相关吗?

时间:2013-01-23 12:21:43

标签: hibernate validation jsf jsf-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'实体。所有实体都是完全有效的,因为select的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( “请求”) 公共类AcaoConverter扩展BaseConverter实现Serializable {

private static final long serialVersionUID = 1L;

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

因此它对所有实体都是相同的转换器。它有效。 为什么不对这个特例? :(

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

这是sql文件中导入的行: a

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

这在数据库上是相同的(因此它被提交): 3

这是SELECT: 4

HTML: 5

SUCESS CASE(选择导入的行): 6

ERROR CASE(选择创建的行): 7

更新4 哇!我测试了一些其他导入的实体,并且...其中一些实际上不起作用。所以,底线:新实体不起作用,一些导入的实体不起作用!查看数据库,它们都是精细的数据,没有任何遗漏或违规。太奇怪了!

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

1 个答案:

答案 0 :(得分:0)

那么,

没有selectOneMenu的解决方案。 所以我使用autoComplete with dropdown(true)。

工作正常。

所以,这不是一个真正的解决方案,而是一种解决方法。 谢谢大家的帮助。