Erro de conversão ao definir valor para 'Conversor nulo' - Por que preciso de um conversor no JSF?
Tenho problemas para entender como usar a seleção no JSF 2 com POJO / entidade de maneira eficaz. Por exemplo, estou tentando selecionar umWarehouse
entidade através do menu suspenso abaixo:
<h:selectOneMenu value="#{bean.selectedWarehouse}">
<f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
<f:selectItems value="#{bean.availableWarehouses}" />
</h:selectOneMenu>
E o bean gerenciado abaixo:
@Named
@ViewScoped
public class Bean {
private Warehouse selectedWarehouse;
private List<SelectItem> availableWarehouses;
// ...
@PostConstruct
public void init() {
// ...
availableWarehouses = new ArrayList<>();
for (Warehouse warehouse : warehouseService.listAll()) {
availableWarehouses.add(new SelectItem(warehouse, warehouse.getName()));
}
}
// ...
}
Observe que eu uso todoWarehouse
entidade como o valor deSelectItem
.
Quando envio o formulário, isso falha com a seguinte mensagem de rostos:
Erro de conversão, definindo o valor 'com.example.Warehouse@cafebabe' para 'Conversor nulo'.
Eu esperava que o JSF pudesse definir o corretoWarehouse
objeto ao meu bean gerenciado quando o envolvo em umSelectItem
. Envolvendo minha entidade dentro doSelectItem
foi feito para pular a criação de umConverter
para minha entidade.
Eu realmente tenho que usar umConverter
sempre que eu quiser fazer uso de entidades na minha<h:selectOneMenu>
? Para o JSF, é possível extrair apenas o item selecionado da lista de itens disponíveis. Se eu realmente preciso usar um conversor, qual é a maneira prática de fazer isso? Até agora cheguei a isso:
Converter
implementação para a entidade.Substituindo ogetAsString()
. Eu acho que não preciso disso, pois a propriedade label doSelectItem
será usado para exibir o rótulo da opção suspensa.Substituindo ogetAsObject()
. Eu acho que isso será usado para retornar o corretoSelectItem
ou entidade, dependendo do tipo de campo selecionado definido no bean gerenciado.ogetAsObject()
me confunde. Qual é a maneira eficiente de fazer isso? Tendo o valor da sequência, como obtenho o objeto de entidade associado? Devo consultar o objeto de entidade do objeto de serviço com base no valor da sequência e retornar a entidade? Ou talvez, de alguma forma, eu possa acessar a lista das entidades que formam os itens de seleção, fazer um loop neles para encontrar a entidade correta e retornar a entidade?
Qual é a abordagem normal disso?