Erro em Conversor JSF

Alguém consegue ajudar?
Quando entro na tela de cadastro para incluir e para alterar o erro acontece:

Erro de conversão ao definir o valor ‘3’ para ‘null Converter’.

Tem muitos tópicos sobre este erro no GUJ, olhei todos e não consegui um que fosse igual ou que tivesse resposta.
A maioria deles é com SelecoOneMenu, que não é o meu caso.
Quando entro na tela o erro aparece, e quando clico numa consulta para alterar também.
O erro é mostrado no espaço do Messages da tela.
Se eu tirar este comando da tela xhtml o erro pára:

<f:metadata>
   <o:viewParam name="id" value="#{cadastroProprietarioBean.proprietario}" />**
</f:metadata>

mas também não faço mais nada.
Já tirei tudo das telas (beans, xhtml), mexi na classe de entidade e nada.
Alguém consegue ajudar por favor?

Você precisa criar um converter, uma classe que implementa a interface faces.convert.Converter, e usar o conversor no seu xhtml.

<f:metadata>
   <o:viewParam name="id" value="#{cadastroProprietarioBean.proprietario}" />
   <f:converter converterId="proprietarioConverter"/>
</f:metadata>


@FacesConverter("proprietarioConverter")
public class ProprietarioConverter implements Converter {

	private EntityManager entity;	
	
	
	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String valor) {
		Integer id = Integer.valueOf(valor);
		entity = JPAUtil.getEntityManager();
		return entity.find(Proprietario.class, id);
	}
	
	
	@Override
	public String getAsString(FacesContext context, UIComponent component, Object object) {
		
		if (object != null) {
			return  ((Proprietario) object).getId().toString();
		}
		return "";
	}

}

Bom dia!

Vamos ver se eu consigo explicar.
No meu bean (CadastroProprietarioBean) tem esse código:

public void prepararCadastro() {

	this.todosEnderecos = enderecos.todos();	
	
	if (this.proprietario == null) {
		this.proprietario = new Proprietario();			
	}	
	
	if (proprietario.getId() == null){
		proprietario.setDataCadastro(Calendar.getInstance());
	}else{
		proprietario.setDataAlteracao(Calendar.getInstance());
	}	
}

que é aplicado na pagina xhtml de cadastro:

<f:metadata>
	<o:viewParam name="id" value="#{cadastroProprietarioBean.proprietario}" />	
	<f:viewAction action="#{cadastroProprietarioBean.prepararCadastro}" />		
</f:metadata>

Na hora de cadastrar dá o erro em questão, só que sem um id porque estou cadastrando:
Erro de conversão ao definir o valor ‘’ para ‘null Converter’.

E não carrega, acredito eu, como consequência deste erro, um Selectonemenu que existe neste cadastro.
Provavelmente porque o erro acontece antes de ser lido o prepararCadastro.
Eu só consegui contornar este erro na inclusão colocando @PostConstruct no método prepararCadastro.
Resolveu mas o erro continua aparecendo.
Agora na alteração eu chamo assim de dentro do dataTable:

 <p:button icon="ui-icon-pencil" title="Editar" outcome="/sistema/proprietarios/CadastroProprietario">
  	<f:param name="id" value="#{proprietario.id}" />						
 </p:button>

Erro de conversão ao definir o valor ‘3’ para ‘null Converter’.

Acho que tem haver mesmo com converter, pelo pouco que sei, mas posso estar errado.

Eu coloquei o conversor como você orientou mas deu erro este erro:

<f:metadata>
	<o:viewParam name="id" value="#{cadastroProprietarioBean.proprietario}" />	
	<f:viewAction action="#{cadastroProprietarioBean.prepararCadastro}" />
	<f:converter converterId="proprietarioConverter"/>
</f:metadata>



FATAL: JSF1073: javax.faces.view.facelets.TagException obtido durante o processamento de RESTORE_VIEW 1: UIComponent-ClientId=, Message=/sistema/proprietarios/CadastroProprietario.xhtml @13,53 <f:converter> Parent not an instance of ValueHolder: javax.faces.component.UIViewRoot@36accd2a
set 06, 2017 10:18:01 AM com.sun.faces.context.ExceptionHandlerImpl log
FATAL: /sistema/proprietarios/CadastroProprietario.xhtml @13,53 <f:converter> Parent not an instance of ValueHolder: javax.faces.component.UIViewRoot@36accd2a
javax.faces.view.facelets.TagException: /sistema/proprietarios/CadastroProprietario.xhtml @13,53 <f:converter> Parent not an instance of ValueHolder: javax.faces.component.UIViewRoot@36accd2a
	at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.apply(ConverterTagHandlerDelegateImpl.java:88)
	at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
	at com.sun.faces.facelets.tag.jsf.core.MetadataHandler.apply(MetadataHandler.java:104)
	at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
	at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
	at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:161)
	at com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:140)
	at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:243)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:123)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at br.com.administracao.filter.JPAFilter.doFilter(JPAFilter.java:48)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at br.com.administracao.filter.AutenticacaoFilter.doFilter(AutenticacaoFilter.java:39)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:625)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:498)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:796)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1372)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

Eu tenho um outro cadastro de onde este foi copiado e funciona sem problemas, eu não entendo porque num cadastro idêntico tudo flui e no outro que é praticamente idêntico, dá erro.

Você pode olhar o fonte que deixei no git para ajudar a entender.

Desculpa amigo, o conversor não vai funcionar nessa situação, quando sugeri o mesmo, foi porque não observei que era um metadata, tente uma das formas abaixo e vamos ver se funciona:

    <f:metadata>
    	<o:viewParam name="id" value="#{cadastroProprietarioBean.proprietario.id}" />
        <f:viewAction action="#{cadastroProprietarioBean.prepararCadastro}" />	
    </f:metadata>

ou

    <f:metadata>
        <f:viewParam id="id" name="id" value="#{cadastroProprietarioBean.id}" required="true">
            <f:validateLongRange minimum="10" maximum="20" />
        </f:viewParam>
        <f:viewAction action="#{cadastroProprietarioBean.prepararCadastro}" />
    </f:metadata>

No seu bean, se você não tem um atributo da classe id, favor criar um Integer id com seu get e set , e faça essa alteração no seu preparaCadastro.

public void prepararCadastro() {

	this.todosEnderecos = enderecos.todos();	

	if (this.proprietario == null) {
		this.proprietario = new Proprietario();
		this.proprietario.setId(id);	
	}	

	if (proprietario.getId() == null){
		proprietario.setDataCadastro(Calendar.getInstance());
	}else{
		proprietario.setDataAlteracao(Calendar.getInstance());
	}	
}

Mais informações nesse link pra te ajudar. Abraço

Que maravilha, o insert saiu o erro, ficou perfeito:

<f:metadata>
	<o:viewParam name="id" value="#{cadastroProprietarioBean.proprietario.id}" />	
	<f:viewAction action="#{cadastroProprietarioBean.prepararCadastro}" />
</f:metadata>

Só a alteração que não trás os dados, tem alguma sugestão?

<p:button icon="ui-icon-pencil" title="Editar" outcome="/sistema/proprietarios/CadastroProprietario">
	<f:param name="id" value="#{proprietario.id}" />						
</p:button>

Agradeço!

Você precisa colocar o atributo update para atualizar o form que deseja ter os campos com os dados do proprietário.

É, ainda não rolou!!!

<h:form id="formConsulta">
			.
                        .
                        . 
<p:column headerText="Operações" style="text-align:center;width:50px">
	<p:button icon="ui-icon-pencil" title="Editar" outcome="/sistema/proprietarios/CadastroProprietario"
			  update="formConsulta">
		<f:param name="id" value="#{proprietario.id}" />						
	</p:button>	
                       .
                       .
                       .

Consegui resolver:
Eu tenho uma busca por id no meu repositório.

if (proprietario.getId() == null){			
	proprietario.setDataCadastro(Calendar.getInstance());
}else{
	this.proprietario = proprietarios.porId(proprietario.getId());
	proprietario.setDataAlteracao(Calendar.getInstance());
}	

Obrigado pela ajuda !
Eu acho estranho essas coisas, num cadastro tudo funcionou certinho, agora neste teve que sair diferente!!!