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>