【发布时间】:2013-01-06 22:14:50
【问题描述】:
我已经在这里阅读了很多关于这个问题的问题,我可以向你保证,这不是 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();
}
注意:这是一个通用转换器。真正的转换器是:
@组件 @Scope("请求") 公共类 AcaoConverter 扩展 BaseConverter 实现 Serializable {
private static final long serialVersionUID = 1L;
@Autowired
public AcaoConverter(AcaoService acaoService) {
super(acaoService, Acao.class);
}
所以它对于所有实体都是相同的转换器。它有效。 为什么不针对这种特殊情况? :(
更新 3 让我们更好地了解问题...
这是从 sql 文件中导入的行:
这是我使用程序创建的一行:
这在数据库上也是一样的(所以提交了):
这是选择:
HTML:
成功案例(选择导入的行):
错误案例(选择创建的行):
更新 4 哇!我用其他一些导入的实体进行了测试,并且......其中一些不起作用。所以,底线:新实体不起作用,一些导入的实体不起作用!查看数据库,它们都是很好的数据,没有丢失或违规。好诡异!
另一件事.. 使用自动完成组件它可以工作!!!! (一切正常)
【问题讨论】:
-
xhtml 看起来没问题,除了第一项的空值。我不确定你的转换器是如何工作的,但这可能是一个问题,我通常使用 #{null} 。除此之外,请发布您的两个 bean 的代码,这样可能会更容易帮助您。
-
感谢您的回复。没有空值不是问题。 :(我已经更新了问题。再次感谢!
-
也许您的问题出在转换器上?请发布这两种方法的代码:getAsObject 和 getAsString
-
您是否尝试过用
<h:selectOneMenu>替换 Primefaces select one menu?过去,我在 Primefaces selectOneMenu 组件中遇到过麻烦的错误。另外,有什么方法可以排除使用分页功能吗?分页使用需要打开事务的滚动结果集。它的使用或配置方式可能存在一些问题
标签: hibernate validation jsf jsf-2