Mensagem JSF exibindo varias vezes

Boa tarde, estou desenvolvendo um método onde eu pego os checkbox selecionados na tela e salvo no banco, o problema é que se eu marco 5 checkbox e clicar em salvar a mensagem “Disciplina adicionada com sucesso!” aparece 5 vezes, como resolvo esse problema?

Código:

public void adicionarDisciplina() {
		
		for (Disciplina disciplina : selectedDisciplinas) {		
							
			AtribuirDisciplinaCurso atribuirDisciplinaCurso = new AtribuirDisciplinaCurso();
			atribuirDisciplinaCurso.setCurso(curso);
			atribuirDisciplinaCurso.setDisciplina(disciplina);					
			 
                        //verifica se a disciplina ja existe no banco.
  			AtribuirDisciplinaCurso verificaAtribuicaoDisciplina = atribuirDisciplinaCursoService
					.verificaAtribuicaoDisciplinaCurso(atribuirDisciplinaCurso
							.getDisciplina().getCodigo(), atribuirDisciplinaCurso
							.getCurso().getCodigo());
			 
			if(verificaAtribuicaoDisciplina == null) {
				atribuirDisciplinaCursoService.atribuirDisciplinaCurso(atribuirDisciplinaCurso);
				
				FacesMessage msg = new FacesMessage("Disciplina adicionada com sucesso!");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}else{
				FacesContext facesContext = FacesContext.getCurrentInstance();
				facesContext.addMessage("disciplina", new FacesMessage(FacesMessage.SEVERITY_WARN, "A seguintes disciplinas já estão cadastradas: " +disciplina.getNome(), null));
			}
					
		}
		
	}

É porque você colocou a instrução “FacesContext.getCurrentInstance().addMessage(null, msg);” dentro do loop.

A lógica está confusa. No caso de selecionar 2 disciplinas novas e 3 já existentes o usuário receberia 5 mensagens do mesmo jeito, só que 2 de sucesso e 3 de erro.
Sugiro, antes de mais nada, não exibir ao usuário displinas que não podem ser utilizadas (isso é por usabilidade).
De toda forma, você precisa fazer seu processamento no loop, registrar sucessos e falhas e fora do loop definir como vai ser a mensagem que vai enviar de volta.

Gedson_Silva você poderia dar um exemplo de como seria a definição dessas mensagens fora do loop?

Obrigado.

StringBuilder sbErro= new StringBuilder();
boolean erro = false;
for (Disciplina disciplina : selectedDisciplinas) {		
	if(verificaAtribuicaoDisciplina == null) {
		atribuirDisciplinaCursoService.atribuirDisciplinaCurso(atribuirDisciplinaCurso);
	}else{
		erro = true;
		sbErro.add(disciplina.getNome()).add(" ");
	}
}

if(erro){
	addMensagemErro("Disciplinas já existe - " sbErro.toString());	
}else{
	addMensagemErro("Disciplinas cadastradas com sucesso);	
}

Alguma coisa nesse sentido.