Bom dia Wh Desenv,
Fiz alguns testes aqui e acredito que o seu problema seja que o objeto ProdutoPedido não está sendo inicializado. Experimente inicializar a ProdutoPedido com 'new ProdutoPedido()'. Irei deixar abaixo o código que utilizei para testar. Simulei como se fosse uma pesquisa no banco de dados. Sugiro que utilize 'change' ao invés de 'blur', acredito ser mais eficaz para a proposta da funcionalidade, já que com blur você entrará no método calcularSubtotal duas vezes. Att.
--- HTML---
<h:body>
<h:form id="frm">
<p:messages />
<p:panelGrid columns="2">
<p:outputLabel value="Pesquisa produto:" for="produto" />
<p:autoComplete id="produto" size="40"
value="#{pedidoController.produtoPedido.produto}"
completeMethod="#{pedidoController.buscaProdutos}"
var="produto" itemLabel="#{produto.descricao}" itemValue="#{produto}"
converter="produtoConverter">
<p:ajax event="change" listener="#{pedidoController.calcularSubtotal()}" />
</p:autoComplete>
</p:panelGrid>
</h:form>
</h:body>
--- Bean ---
@ManagedBean
@ViewScoped
public class PedidoController implements Serializable {
private static final long serialVersionUID = 1L;
private ProdutoPedido produtoPedido = new ProdutoPedido();
public List<Produto> buscaProdutos(String descricao) {
return getProdutosPelaDescricao(descricao);
}
private List<Produto> getProdutosPelaDescricao(String descricao) {
List<Produto> produtos = Arrays.asList(new Produto(1, "camisa", 10), new Produto(2, "short", 20), new Produto(3, "livro", 30));
return produtos.stream().filter(p -> p.getDescricao().contains(descricao)).collect(Collectors.toList());
}
public void calcularSubtotal() {
System.out.println("Entrou no método calculaSubTotal");
if (produtoPedido.getProduto() != null) {
System.out.println(produtoPedido.getProduto().getDescricao());
}
}
public ProdutoPedido getProdutoPedido() {
return produtoPedido;
}
public void setProdutoPedido(ProdutoPedido produtoPedido) {
this.produtoPedido = produtoPedido;
}
}
--- Classe Produto ---
public class Produto {
private long id;
private String descricao;
private int valor;
public Produto() {
}
public Produto(long id, String descricao, int valor) {
this.id = id;
this.descricao = descricao;
this.valor = valor;
}
public long getId() {
return id;
}
public String getDescricao() {
return descricao;
}
public int getValor() {
return valor;
}
}
--- Conversor ---
@FacesConverter("produtoConverter")
public class ProdutoConverter implements Converter {
// Simula Banco de dados
private List<Produto> produtos = Arrays.asList(new Produto(1, "camisa", 10), new Produto(2, "short", 20), new Produto(3, "livro", 30));
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Optional<Produto> produto = null;
if (value != null && !value.isEmpty()) {
produto = produtos.stream().filter(p -> p.getDescricao().contains(value)).findFirst();
}
return produto.orElse(new Produto());
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return String.valueOf(((Produto) value).getId());
}
}
--- ProdutoPedido
public class ProdutoPedido {
private Produto produto;
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
}