Ajuda com código > JSF - SelectOneMenu

Tenho uma clase Cadastrados e ela tem uma lista de tipo cadastrado não conseguindo adicionar na lista com o SelectOneMenu , alguem pode me ajudar , quando eu aperto o botao confirmar na pagina web fica vermelho ao redor da SelectOneMenu

      <p:selectOneMenu id="comboTipo" value="#{CadastradosControl.tipocadastrado}" style="width:400px">
                    <f:selectItem itemLabel="Selecione o tipo" itemValue=""/>
                    <f:selectItems value="#{CadastradosControl.listaTipoCadastrados}" var="tipo"
                                   itemLabel="#{tipo.tipo}" itemValue="#{tipo}"/>
                </p:selectOneMenu>


                <b:commandButton value="Confirmar" update="formulario"
                                 process="formulario"
                                 actionListener="#{CadastradosControl.confirmar}" look="success"/>

ManagedBen:

package br.com.senai.fatesg.primefaces.controle;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Named;


import org.springframework.beans.factory.annotation.Autowired;

import br.com.ambientinformatica.ambientjsf.util.UtilFaces;
import br.com.senai.fatesg.primefaces.entidade.Cadastrados;
import br.com.senai.fatesg.primefaces.entidade.TipoCadastrado;
import br.com.senai.fatesg.primefaces.persistencia.CadastradosDao;
import br.com.senai.fatesg.primefaces.persistencia.TipoCadastradosDao;

@Named("CadastradosControl")
@RequestScoped
public class CadastradosControl {
	// entidades
	private Cadastrados cadastrado = new Cadastrados();

	private TipoCadastrado tipocadastrado = new TipoCadastrado();

	@Autowired
	private CadastradosDao cadastradosDao;

	@Autowired
	private TipoCadastradosDao tipoCadastradoDao;

	// listas
	private List<Cadastrados> cadastrados = new ArrayList<Cadastrados>();
	private List<TipoCadastrado> listaTipoCadastrados = new ArrayList<TipoCadastrado>();
	private String nome;


	@PostConstruct
	public void init() {
		listar(null);
	}


	public void listar(ActionEvent evt) {
		try {
			cadastrados = cadastradosDao.listar();
			listaTipoCadastrados = tipoCadastradoDao.listar();
		} catch (Exception e) {
			UtilFaces.addMensagemFaces(e);
		}

	}

	public void PesquisarNome() {
		cadastrados = cadastradosDao.buscaPor(this.nome);
		System.out.println();
	}


	public void confirmar() {

		try {
			cadastrado.addTipoCadastro(tipocadastrado);
			cadastradosDao.incluir(cadastrado);
			cadastrado = new Cadastrados();
		} catch (Exception e) {
			UtilFaces.addMensagemFaces(e);
		}
	}

	public Cadastrados getCadastrado() {
		return cadastrado;
	}

	public void setCadastrado(Cadastrados cadastrado) {
		this.cadastrado = cadastrado;
	}

	public TipoCadastrado getTipocadastrado() {
		return tipocadastrado;
	}

	public void setTipocadastrado(TipoCadastrado tipocadastrado) {
		this.tipocadastrado = tipocadastrado;
	}

	public CadastradosDao getCadastradosDao() {
		return cadastradosDao;
	}

	public void setCadastradosDao(CadastradosDao cadastradosDao) {
		this.cadastradosDao = cadastradosDao;
	}

	public TipoCadastradosDao getTipoCadastradoDao() {
		return tipoCadastradoDao;
	}

	public void setTipoCadastradoDao(TipoCadastradosDao tipoCadastradoDao) {
		this.tipoCadastradoDao = tipoCadastradoDao;
	}

	public List<Cadastrados> getCadastrados() {
		return cadastrados;
	}

	public void setCadastrados(List<Cadastrados> cadastrados) {
		this.cadastrados = cadastrados;
	}

	public List<TipoCadastrado> getListaTipoCadastrados() {
		return listaTipoCadastrados;
	}

	public void setListaTipoCadastrados(List<TipoCadastrado> listaTipoCadastrados) {
		this.listaTipoCadastrados = listaTipoCadastrados;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
}

Classe cadastrados:
package br.com.senai.fatesg.primefaces.entidade;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

import org.hibernate.validator.constraints.NotBlank;

@Entity
public class Cadastrados {

	@Id
	@GeneratedValue(generator = "cadastrados_seq", strategy = GenerationType.SEQUENCE)
	@SequenceGenerator(name = "cadastrados_seq", sequenceName = "cadastrados_seq", allocationSize = 1, initialValue = 1)
	private Long id;

	@NotBlank
	@Column(nullable = false)
	private String cpf;

	@ManyToMany(cascade=CascadeType.ALL)
	@JoinTable(name="pessoa_tipo",joinColumns={@JoinColumn(name="tipo_id")},
	inverseJoinColumns={@JoinColumn(name="cadastrado_id")})
	private List<TipoCadastrado> listPessoaImovelTipo = new ArrayList<TipoCadastrado>();
		
	
	private String email;
	private String nome;
	private String celular;
	private Date datadenascimento;
	private int statuscadastro;


	public void addTipoCadastro(TipoCadastrado tipoCadastrado){
		listPessoaImovelTipo.add(tipoCadastrado);
	}
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public Date getDatadenascimento() {
		return datadenascimento;
	}

	public void setDatadenascimento(Date datadenascimento) {
		this.datadenascimento = datadenascimento;
	}

	public int getStatuscadastro() {
		return statuscadastro;
	}

	public void setStatuscadastro(int statuscadastro) {
		this.statuscadastro = statuscadastro;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Long getId() {
		return id;
	}

	public List<TipoCadastrado> getListPessoaImovelTipo() {
		return listPessoaImovelTipo;
	}

	public void setListPessoaImovelTipo(List<TipoCadastrado> listPessoaImovelTipo) {
		this.listPessoaImovelTipo = listPessoaImovelTipo;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		Cadastrados that = (Cadastrados) o;
		return statuscadastro == that.statuscadastro &&
				id.equals(that.id) &&
				cpf.equals(that.cpf) &&
				listPessoaImovelTipo.equals(that.listPessoaImovelTipo) &&
				email.equals(that.email) &&
				nome.equals(that.nome) &&
				celular.equals(that.celular) &&
				datadenascimento.equals(that.datadenascimento);
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, cpf, listPessoaImovelTipo, email, nome, celular, datadenascimento, statuscadastro);
	}
}

Já estou a algum tempo procurando como solucionar , ja usei alguns conversores porem nao dei conta de solucionar.

Conseguiram Entender ?

Ao escolher a opção do selectOneMenu, entenda acontece duas coisas:

1 - Ele vai retorna um objeto “tipo”, digo o component <f:selectItens pega da lista que você declarou um objeto em itemValue="#{tipo}", mas aqui tem uma pegadinha, preste atenção o seu “tipo” é um objeto, correto? Pois bem o JSF vai descobrir o ID do objeto, digamos que seja 42, então o JSF joga esse 42 para o <p:selectOneMenu por sua vez tenta carregar o atributo: ```
value="#{CadastradosControl.tipocadastrado}", então eu pergunto ele pode carregar um objeto do tipoCadastrado com um int por exemplo? Não né.

2 - Você precisa pesquisar pra criar um converter pra esse objeto, onde ele recebe um ID e carrega o objeto, ah, lembro que tudo que estar dentro de um formulario.

Entendi como ele funciona depois da sua explicação , entao fui la e criei um converter:

@FacesConverter("cadastradosConverter")
public class CadastradosConverter implements Converter {

TipoCadastradosDao dao;

public String getAsString(FacesContext context, UIComponent component,
                          Object value) {
    if (value == null || value=="") {
        return null;
    }

    TipoCadastrado tipo = (TipoCadastrado) value;

    return tipo.getId()+";"+tipo.getTipo()+";";
}

public Object getAsObject(FacesContext context, UIComponent component,
                          String value) {
    if (value == null) {
        return null;
    }
        String[] tudo = value.split(";");
        int id = Integer.parseInt(tudo[0]);
        String tipo = tudo[1];



        return new TipoCadastrado(id,tipo);

}

}

E esta voltando um objeto agora como vc me explicou que era necessario , porem ele fica vermelho em volta da box e não faz nada. ja tentei olhar no log do browser (F12) nao tem nada

meu codigo do selectone ficou assim:

 <p:selectOneMenu id="comboTipo" value="#{CadastradosControl.tipocadastrado}" style="width:400px" converter="cadastradosConverter">
                <f:selectItems value="#{CadastradosControl.listaTipoCadastrados}" var="tipo"
                               itemLabel="#{tipo.tipo}" itemValue="#{tipo}"/>
            </p:selectOneMenu>

Você esta usando algum validate bean, tipo validação de objeto