我已经在这里阅读了很多关于这个问题的问题,我可以向你保证,这不是 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 文件中导入的行:
这是我使用该程序创建的一行:
这在数据库上是一样的(所以它被提交了):
这是选择:
的HTML:
成功案例(选择导入的行):
错误案例(选择创建的行):
更新 4哇!我用其他一些导入的实体进行了测试,并且......其中一些不起作用。所以,底线:新实体不起作用,一些导入的实体不起作用!查看数据库,它们都是很好的数据,没有丢失或违规。好诡异!
另一件事..使用 autoComplete 组件它可以工作!!!!(一切正常)