2 ComboBox aninhados com jsf e primefaces

Boa tarde Galera

Estou necessitando fazer um Combo aninhado com Dentista e Paciente no Primefaces com jsf 2.2 e tomcat 7.0.53. Quando compilo para chamar a minha view no browse aparece essa mensagem de erro abaixo:

Informações: Server startup in 12408 ms
Jul 25, 2014 6:22:13 PM com.sun.faces.application.ApplicationImpl newThing
Grave: Unable to load class:
java.lang.InstantiationException: r.com.safp.bean.OsBean$ConverterDentista
at java.lang.Class.newInstance(Unknown Source)

Meu bean:

@ManagedBean(name = "MBOs")
@ViewScoped
public class OsBean{

	/**
	 * 
	 */
	private ArrayList<Os> itens;
	private ArrayList<Os> itensFiltrados;

	private Os os = new Os();
	private DentistaPaciente dp = new DentistaPaciente();
	private Dentista dentista;
	private ArrayList<Dentista> comboDentista;
	private ArrayList<Paciente> comboPaciente;
	private ArrayList<DentistaPaciente> comboDentistaPaciente;
	private ArrayList<Protese> comboProtese;
	public ArrayList<Os> getItens() {
		return itens;
	}

	public void setItens(ArrayList<Os> itens) {
		this.itens = itens;
	}

	public ArrayList<Os> getItensFiltrados() {
		return itensFiltrados;
	}

	public void setItensFiltrados(ArrayList<Os> itensFiltrados) {
		this.itensFiltrados = itensFiltrados;
	}

	public Os getOs() {
		return os;
	}

	public void setOs(Os os) {
		this.os = os;
	}

	public ArrayList<Dentista> getComboDentista() {
		return comboDentista;
	}

	public void setComboDentista(ArrayList<Dentista> comboDentista) {
		this.comboDentista = comboDentista;
	}

	public ArrayList<Protese> getComboProtese() {
		return comboProtese;
	}

	public void setComboProtese(ArrayList<Protese> comboProtese) {
		this.comboProtese = comboProtese;
	}

	public DentistaPaciente getDp() {
		return dp;
	}

	public void setDp(DentistaPaciente dp) {
		this.dp = dp;
	}

	public ArrayList<DentistaPaciente> getComboDentistaPaciente() {
		return comboDentistaPaciente;
	}

	public void setComboDentistaPaciente(
			ArrayList<DentistaPaciente> comboDentistaPaciente) {
		this.comboDentistaPaciente = comboDentistaPaciente;
	}

	public void carregarListagem() {
		try {
			DentistaDAO daod = new DentistaDAO();
			// PacienteDAO daop = new PacienteDAO();
			System.out.println("passou carregarListagem() ");
			ProteseDAO daopr = new ProteseDAO();
			comboDentista = daod.listar();
			// comboPaciente = daop.listar();
			comboProtese = daopr.listar();
			OsDAO dao = new OsDAO();
			itens = dao.listar();
		} catch (SQLException e) {
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro(e.getMessage());
		}
	}

	public void carregarDentistaPaciente(AjaxBehaviorEvent event) {

		try {
			DentistaPacienteDAO daodp = new DentistaPacienteDAO();
			System.out.println("passou carregarDentistaPaciente Bean() = "
					+ dentista.hashCode());
/*			comboDentistaPaciente = daodp.buscaPorDentista(String
					.valueOf(dentista));*/
			comboDentistaPaciente = daodp.buscaPorDentista("1");
		} catch (SQLException e) {
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro(e.getMessage());
		}
	}

	public void prepararNovo() {
		try {
			Os o = new Os();
			DentistaDAO daod = new DentistaDAO();
			PacienteDAO daop = new PacienteDAO();
			ProteseDAO daopr = new ProteseDAO();
			comboDentista = daod.listar();
			comboPaciente = daop.listar();
			comboProtese = daopr.listar();
		} catch (SQLException ex) {
			ex.printStackTrace();
			JSFUtil.adicionarMensagemErro(ex.getMessage());
		}
	}

	public void novo() {
		try {
			OsDAO dao = new OsDAO();
			dao.salvar(os);
			itens = dao.listar();
			JSFUtil.adicionarMensagemSucesso("Os salvo com sucesso!");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro(e.getMessage());
		}
	}

	public void excluir() {
		try {
			OsDAO dao = new OsDAO();
			dao.excluir(os);
			itens = dao.listar();
			JSFUtil.adicionarMensagemSucesso("Os excluido com sucesso!");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro(e.getMessage());
		}
	}

	public void prepararEditar() {
		try {
			DentistaDAO dao = new DentistaDAO();
			PacienteDAO daotpu = new PacienteDAO();
			comboDentista = dao.listar();
			comboPaciente = daotpu.listar();
		} catch (SQLException ex) {
			ex.printStackTrace();
			JSFUtil.adicionarMensagemErro(ex.getMessage());
		}
	}

	public void editar() {
		try {
			OsDAO dao = new OsDAO();
			dao.editar(os);
			itens = dao.listar();
			JSFUtil.adicionarMensagemSucesso("Os editado com sucesso!");
		} catch (SQLException e) {
			e.printStackTrace();
			JSFUtil.adicionarMensagemErro(e.getMessage());
		}
	}
	@FacesConverter(value="converterDentista")    
	public class ConverterDentista implements Converter {  
	  
	    @Override    
	    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {    
	        if(value != null) {    
	            try { 
	            	System.out.println(" value="+value);
	            	DentistaDAO dao = new DentistaDAO();
	                return dao.buscarPorCodigo(Long.valueOf(value));      
	            } catch (SQLException ex) {  
	    			ex.printStackTrace();
	    			JSFUtil.adicionarMensagemErro(ex.getMessage());
	            }  
	        }    
	        return null;    
	    }    
	    @Override
	    public String getAsString(FacesContext context, UIComponent component, Object value) {
	    if (value instanceof Dentista) {
	    Dentista dentista = (Dentista) value;
	    return String.valueOf(dentista.getId());
	    }
	    return "";
	    }
	    
	/*        @Override    
	    public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {    
	        if(object != null && object instanceof Dentista) {    
	            return ((Dentista)object).getId().toString();    
	        }    
	        return null;    
	    } */   
	}
	@FacesConverter(value="converterPaciente")
	public class ConverterPaciente implements Converter {
	 
	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
	if (value != null && !value.equals("")) {
	PacienteDAO dao = new PacienteDAO();
	try {
		return dao.buscarPorCodigo(Long.valueOf(value));
	} catch (NumberFormatException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		JSFUtil.adicionarMensagemErro(e.getMessage());
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		JSFUtil.adicionarMensagemErro(e.getMessage());
	}
	}
	return null;
	}
	 
	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
	if (value instanceof Paciente) {
	Paciente paciente = (Paciente) value;
	return String.valueOf(paciente.getId());
	}
	return "";
	}
	 
	}

	public Dentista getDentista() {
		return dentista;
	}

	public void setDentista(Dentista dentista) {
		this.dentista = dentista;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((dentista == null) ? 0 : dentista.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		OsBean other = (OsBean) obj;
		if (dentista == null) {
			if (other.dentista != null)
				return false;
		} else if (!dentista.equals(other.dentista))
			return false;
		return true;
	}

	public ArrayList<Paciente> getComboPaciente() {
		return comboPaciente;
	}

	public void setComboPaciente(ArrayList<Paciente> comboPaciente) {
		this.comboPaciente = comboPaciente;
	}
}

Minha view com o botão Novo:

		<p:dialog widgetVar="dlgOsNovo" closable="false" draggable="false"
			resizable="false" header="Ordem de Serviço - Novo" modal="true"
			appendTo="@(body)">
			<h:form id="frmOsNovo">
				<p:panelGrid id="pnlOsNovo" columns="2">
					<p:outputLabel value="Dentista:" />
					<p:selectOneMenu value="#{MBOs.os.dentista.id}" id="dentista" converter="converterDentista" >
						<f:selectItem itemValue="" itemLabel="Selecione um Dentista:" />
						<f:selectItems value="#{MBOs.comboDentista}" var="item"
							itemValue="#{item.id}" itemLabel="#{item.nome}">
           				</f:selectItems> 
    					<f:ajax  
    						render="paciente" 
					        listener="#{MBOs.carregarDentistaPaciente}"  
           					event="change"    
           					process="frmOsNovo" />   
					</p:selectOneMenu>
					<p:outputLabel value="Paciente: "  />
  					<p:selectOneMenu id="paciente" value="#{MBOs.os.paciente.id}" filter="true"
						 required="true" requiredMessage="O campo paciente é obrigatório!" >
					<f:selectItem itemValue="" itemLabel="Selecione um Paciente:" />
					<f:selectItems value="#{MBOs.comboDentistaPaciente}" var="item"
						itemValue="#{item.id}" itemLabel="#{item.nome}"/>
					</p:selectOneMenu>  
				</p:panelGrid>
				<p:panelGrid columns="2">
					<p:commandButton value="Gravar" actionListener="#{MBOs.novo}"
						update=":msgGlobal :frmOs:tblOs"
						oncomplete="verificar(xhr, status, args, 'dlgOsNovo', 'tabelaOs');" />
					<p:commandButton value="Cancelar"
						oncomplete="PF('dlgOsNovo').hide();" />

				</p:panelGrid>
			</h:form>
		</p:dialog>

Aguem já passou por esse problema e pode me ajudar, agradeceria muito pois, o programa estava funcionando sem essa nova adaptação da classe Converter do Faces e já dura 3 dias e precisei pegar o ID do ComboBox(SelectOnemenu). Não sei se essa é a única alternativa para isso. Preciso de ajuda. Grato.

Pessoal
Conseguir resolver o tópico em questão: Não precisei pegar o ID da combobox pela classe Converter do jsf, fiz pelo valueChangeListener
que tem uma função para pegar esse valor.

Muito obrigado a todos.