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:

Crie umConverter 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?

questionAnswers(2)

yourAnswerToTheQuestion