Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Criar lista para preencher select com dados do bd

Decidi desenvolver um sistema para fixar o conteúdo visto no curso, mas estou com dificuldades para preencher um List e passar para um select na view. Eu criei uma entidade Nivel:

    @Entity
@Table(name="niveis")
public class Nivel extends AbstractPersistable<Long> {

@NotBlank(message="Campo obrigatório.")
@Length(min = 3, max = 50)
@Column(nullable = false, unique = true, length = 50)
private String nome;

@ElementCollection
private List<Nivel> niveis = new ArrayList<>();

public String getNome() {
    return nome;
}

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

@Override
public void setId(Long id) {

    super.setId(id);
}

public List<Nivel> getNiveis() {
    return niveis;
}

public void setNiveis(List<Nivel> niveis) {
    this.niveis = niveis;
}

e no service faço um findAll() para pegar os dados:

    @Service
    @Transactional(readOnly=true, propagation = Propagation.REQUIRED)
    public class NivelService {

@Autowired
private NivelRepository repository;

public Page<Nivel> findByPagination(int page, int size) {
    Pageable pageable = new PageRequest(page, size);
    return repository.findAllByOrderByNomeAsc(pageable);
}

    public List<Nivel> findAll() {

    return repository.findAll();
}


public Nivel findById(Long id) {

    return repository.findOne(id);
}

já o repository ficou assim:

    public interface NivelRepository extends JpaRepository<Nivel, Long>{

    Page<Nivel> findAllByOrderByNomeAsc(Pageable pageable);
    List<Nivel> findAll();
    Nivel findOne(Long id);

    }

a ideia é colocar um select para que o usuário possa selecionar um nível desejado para um chamado especifico. Então na minha entidade chamado eu faço a relação entre Nivel e Chamado:

@Entity
@Table(name="chamados")
    public class Chamado extends AbstractPersistable<Long>{

@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name="nivel_id")
private Nivel nivel;

    @ElementCollection
private List<Nivel> niveis = new ArrayList<>();

public List<Nivel> getNiveis() {
    return niveis;
}

public void setNiveis(List<Nivel> niveis) {
    this.niveis = niveis;
}

O controller:

@RequestMapping(value = {"/nivel/{id}", "/list"}, method =                             RequestMethod.GET)
public ModelAndView getNivel(@PathVariable("id") Optional<Long> id) {

    ModelAndView view = new ModelAndView("nivel/list");

    if (id.isPresent()) {

        Nivel nivel = nivelService.findById(id.get());        
        view.addObject("niveis", Arrays.asList(nivel));
    } else {

        List<Nivel> niveis = nivelService.findAll();
        view.addObject("niveis", niveis);
        Page<Nivel> page = nivelService.findByPagination(0, 5);
        view.addObject("page", page);
        view.addObject("urlPagination", "/nivel/page");
    }

    return view;                
}

mas a minha jsp não está recebendo os valores no select.

<label for="nivel">Nível</label>
 <select class="form-control" id="nivel" name="nivel" required>
    <optgroup label="Selecione um Nível">
        <c:forEach items="${niveis}"  var="nivel">
            <option value="${nivel.id}">${nivel.nome}</option>
    </c:forEach>
        </optgroup>
</select>
2 respostas

Opa, só olhando o código não foi suficiente para eu achar o erro. Parece que a montagem do select está correta... qual o erro que da?

solução!

Bom dia Alberto! Consegui resolver. Não dava nenhum erro, apenas os campos do select apareciam em branco. Apenas removi o "new ArrayList" da declaração da lista de níveis. Estava assim: @ElementCollection private List niveis = new ArrayList<>();

Aí funcionou normalmente.

Agradeço muito a atenção!