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

Não consigo salvar o código do ENUM

Olá, Não consigo salvar o valor do enum como código. Seria um problema no Bind do Spring?

Qual seria o problema?

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Título
Descrição
Páginas
${tipoPreco}

ProdutoController.class

'''@Controller public class ProdutosController {

@Autowired private ProdutoDAO produtoDAO;

@RequestMapping("/produtos/form") public ModelAndView form() { System.out.println("Informações de entrada"); ModelAndView modelAndView = new ModelAndView("produtos/form"); modelAndView.addObject("tipos", TipoPreco.values());

return modelAndView; }

@RequestMapping("/produtos") public String gravar(Produto produto) { System.out.println(produto);

produtoDAO.gravar(produto); return "produtos/ok"; } }'''

Produto.class

'''@Entity public class Produto { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String titulo; private String descricao; private Integer paginas; @ElementCollection private List precos; } ''''

Preco

'''@Embeddable public class Preco { private BigDecimal valor; private TipoPreco tipo; }'''

TipoPreco

'''public enum TipoPreco { EBOOK, IMPRESSO, COMBO; } '''

5 respostas

Olá Jonas,

Verifique se na sua classe Produto está corretamente como:

@ElementCollection
    private List<Preco> precos;

Pelo que vi no seu print parece que está faltando o no List.

Somente ajustando a resposta que perdeu formatação...

Pelo que vi no seu print parece que está faltando o <Preco> o List.

Desculpa pela formatação.

O campo List já está com <Preco>no List.

@Entity
public class Produto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;
    @ElementCollection
    private List<Preco> precos;

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Integer getPaginas() {
        return paginas;
    }

    public void setPaginas(Integer paginas) {
        this.paginas = paginas;
    }

    public int getId() {
        return id;
    }

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

    public List<Preco> getPrecos() {
        return precos;
    }

    public void setPrecos(List<Preco> precos) {
        this.precos = precos;
    }

    @Override
    public String toString() {
        return "Produto [id=" + id + ", titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas
                + ", precos=" + precos + "]";
    }

}

ProdutosController

@Controller
@RequestMapping("/produtos")
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDAO;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(new ProdutoValidation());
    }

    @RequestMapping("/form")
    public ModelAndView form() {
        ModelAndView modelAndView = new ModelAndView("/produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(@Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) {
        if (result.hasErrors()) {
            return form();
        }
        produtoDAO.gravar(produto);
        redirectAttributes.addFlashAttribute("message", "Produto cadastrado com sucesso");
        return new ModelAndView("redirect:produtos");
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView listar() {
        ModelAndView modelAndView = new ModelAndView("produtos/lista");
        List<Produto> produtos = produtoDAO.listar();
        modelAndView.addObject("produtos", produtos);

        return modelAndView;
    }

}

'

Título
Descrição
Páginas
${tipoPreco}
'

Preco

@Embeddable
public class Preco {

    private BigDecimal valor;
    private TipoPreco tipo;

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public TipoPreco getTipoPreco() {
        return tipo;
    }

    public void setTipoPreco(TipoPreco tipoPreco) {
        this.tipo = tipoPreco;
    }

    @Override
    public String toString() {
        return "Preco [valor=" + valor + ", tipo=" + tipo + "]";
    }

}

TipoPreco

public enum TipoPreco {
    EBOOK, IMPRESSO, COMBO;
}

ProdutoDAO

@Repository
@Transactional
public class ProdutoDAO {

    @PersistenceContext
    private EntityManager entityManager;

    public void gravar(Produto produto) {
        entityManager.persist(produto);
    }

    public List<Produto> listar() {
        return entityManager.createQuery("select p from Produto p ",Produto.class).getResultList();
    }

}
solução!

Olá,

Descobrir o erro, o problema estava na classe Preco. Os getters e setters estavam com o nome diferente do jsp.

no JSP está " tipo" e os getters e setters estavam "setTipoPreco" e "getTipoPreco".

Obrigado .