11
respostas

Erro: java.lang.NullPointerException - Nao consegui identificar o erro, copiei o material da aula, mas o erro persiste

public class CarrinhoItem {

private Produto produto;
private TipoPreco tipoPreco;

public CarrinhoItem(Produto produto, TipoPreco tipoPreco) {
    this.produto = produto;
    this.tipoPreco = tipoPreco;
}

public BigDecimal getPreco() {
    return produto.precoPara(tipoPreco);
}

public Produto getProduto() {
    return produto;
}

public void setProduto(Produto produto) {
    this.produto = produto;
}

public TipoPreco getTipoPreco() {
    return tipoPreco;
}

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

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((produto == null) ? 0 : produto.hashCode());
    result = prime * result + ((tipoPreco == null) ? 0 : tipoPreco.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;
    CarrinhoItem other = (CarrinhoItem) obj;
    if (produto == null) {
        if (other.produto != null)
            return false;
    } else if (!produto.equals(other.produto))
        return false;
    if (tipoPreco != other.tipoPreco)
        return false;
    return true;
}

public BigDecimal getTotal(int quantidade) {
    return this.getPreco().multiply(new BigDecimal(quantidade));            
}

}

@Controller @RequestMapping("/carrinho") @Scope(value=WebApplicationContext.SCOPE_REQUEST) public class CarrinhoComprasController {

@Autowired
private ProdutoDAO produtoDao;

@Autowired
private CarrinhoCompras carrinho;

@RequestMapping("/add")
public ModelAndView add(Integer produtoId, TipoPreco tipoPreco) {
    ModelAndView modelAndView = new ModelAndView("redirect:/carrinho");
    CarrinhoItem carrinhoItem = criaItem(produtoId, tipoPreco);
    carrinho.add(carrinhoItem);
    return modelAndView;
}

@RequestMapping(method=RequestMethod.GET)
public ModelAndView itens() {
    return new ModelAndView("carrinho/itens");
}

private CarrinhoItem criaItem(Integer produtoId, TipoPreco tipoPreco) {
    Produto produto = this.produtoDao.find(produtoId);
    CarrinhoItem carrinhoItem = new CarrinhoItem(produto, tipoPreco);
    return carrinhoItem;
}

}

ERRO: exception

org.apache.jasper.JasperException: An exception occurred processing [WEB-INF/views/carrinho/itens.jsp] at line [92]

89:

90: 91:
92:
${carrinhoCompras.getTotal(item) }
93:
94: 95: <input type="image" src="${contextPath }/resources/imagens/excluir.png"

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:607) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:496) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

11 respostas

Boa tarde, Tiago! Como vai?

Como o log diz, o erro está ocorrendo na linha 92 da página WEB-INF/views/carrinho/itens.jsp. Onde parece que vc está fazendo ${carrinhoCompras.getTotal(item) }. Para poder verificar o que está acontecendo, vc poderia postar aqui o código da página itens.jsp e da classe a que se refere o objeto carrinhoCompras? Daí eu posso dar uma olhada melhor e tentar te ajudar!

Outra coisa, o log que vc postou não está completo, né? Se possível, poste tbm o log completo que talvez ajude a dar uma ideia melhor do que está acontecendo!

Aguardo o seu retorno para juntos chegarmos à luz do conhecimento!

Grande abraço e bons estudos, meu aluno!

Vou mandar separado por conta do limite de caracteres. Ok? Primeiro itens.jsp, parte 1:

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

<c:url value="/" var="contextPath" />

<header id="layout-header">
    <div class="clearfix container">
        <a href="/" id="logo"> </a>
        <div id="header-content">
            <nav id="main-nav">
                <ul class="clearfix">
                    <li><a href="${s:mvcUrl('CCC#itens').build() }" rel="nofollow">Carrinho (${carrinhoCompras.quantidade })</a></li>
                    <li><a href="/pages/sobre-a-casa-do-codigo" rel="nofollow">Sobre Nós</a></li>
                    <li><a href="/pages/perguntas-frequentes" rel="nofollow">Perguntas Frequentes</a></li>
                </ul>
            </nav>
        </div>
    </div>
</header>

<nav class="categories-nav">
    <ul class="container">
        <li class="category"><a href="http://www.casadocodigo.com.br">Home</a></li>
        <li class="category"><a href="/collections/livros-de-agile"> Agile </a></li>
        <li class="category"><a href="/collections/livros-de-front-end"> Front End </a></li>
        <li class="category"><a href="/collections/livros-de-games"> Games </a></li>
        <li class="category"><a href="/collections/livros-de-java"> Java </a></li>
        <li class="category"><a href="/collections/livros-de-mobile"> Mobile </a></li>
        <li class="category"><a href="/collections/livros-desenvolvimento-web"> Web </a></li>
        <li class="category"><a href="/collections/outros"> Outros </a></li>
    </ul>
</nav>

<section class="container middle">
    <h2 id="cart-title">Seu carrinho de compras</h2>
    <table id="cart-table">
        <colgroup>
            <col class="item-col" />
            <col class="item-price-col" />
            <col class="item-quantity-col" />
            <col class="line-price-col" />
            <col class="delete-col" />
        </colgroup>
        <thead>
            <tr>
                <th class="cart-img-col"></th>
                <th width="65%">Item</th>
                <th width="10%">Preço</th>
                <th width="10%">Quantidade</th>
                <th width="10%">Total</th>
                <th width="5%"></th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${carrinhoCompras.itens }" var="item">
                <tr>
                    <td class="cart-img-col"><img src="http://cdn.shopify.com/s/files/1/0155/7645/products/css-eficiente-featured_large.png?v=1435245145"
                        width="71px" height="100px" />
                    </td>
                    <td class="item-title">${item.produto.titulo }</td>
                    <td class="numeric-cell">${item.preco }</td>
                    <td class="quantity-input-cell">
                            <input type="number" min="0" id="quantidade" name="quantidade" value="${carrinhoCompras.getQuantidade(item) }" />
                    </td>
                    <td class="numeric-cell">${carrinhoCompras.getTotal(item) }</td>
                    <td class="remove-item">
                        <form action="" method="POST">
                            <input type="image" src="${contextPath }/resources/imagens/excluir.png" 
                                alt="Excluir" title="Excluir" />
                        </form>    
                    </td>
                </tr>
            </c:forEach>
        </tbody>

Agora Itens parte 2:

        <tfoot>
            <tr>
                <td colspan="3"><input type="submit" class="checkout" name="checkout" value="Finalizar compra" /></td>
                <td class="numeric-cell">${carrinhoCompras.total }</td>
                <td></td>
            </tr>
        </tfoot>
    </table>

    <h2>Você já conhece os outros livros da Casa do Código?</h2>
    <ul id="collection" class="related-books">
        <li class="col-left"><a href="/products/livro-plsql" class="block clearfix book-suggest"
            data-book="PL/SQL: Domine a linguagem do banco de dados Oracle"> <img width="113px" height="160px"
                src="http:////cdn.shopify.com/s/files/1/0155/7645/products/plsql-featured_compact.png?v=1434740236"
                alt="PL/SQL: Domine a linguagem do banco de dados Oracle" />
        </a></li>
    </ul>

    <h2>
        <a href="http://www.casadocodigo.com.br">Veja todos os livros que publicamos!</a>
    </h2>
</section>

<footer id="layout-footer">
    <div class="clearfix container">
        <div id="collections-footer">
            <!-- cdc-footer -->
            <p class="footer-title">Coleções de Programação</p>
            <ul class="footer-text-links">
                <li><a href="/collections/livros-de-java">Java</a></li>
                <li><a href="/collections/livros-desenvolvimento-web">Desenvolvimento Web</a></li>
                <li><a href="/collections/livros-de-mobile">Mobile</a></li>
                <li><a href="/collections/games">Games</a></li>
                <li><a href="/collections/livros-de-front-end">Front End</a></li>
            </ul>
            <p class="footer-title">Outros Assuntos</p>
            <ul class="footer-text-links">
                <li><a href="/collections/livros-de-agile">Agile</a></li>
                <li><a href="/collections/outros">e outros...</a></li>
            </ul>
        </div>
        <div id="social-footer">
            <!-- books-footer -->
            <p class="footer-title">Links da Casa do Código</p>
            <ul class="footer-text-links">
                <li><a href="http://livros.casadocodigo.com.br" rel="nofollow">Meus E-books</a></li>
                <li><a href="/pages/sobre-a-casa-do-codigo">Sobre a Casa do Código</a></li>
                <li><a href="/pages/perguntas-frequentes">Perguntas Frequentes</a></li>
                <li><a href="https://www.caelum.com.br">Caelum - Ensino e Inovação</a></li>
                <li><a href="http://www.codecrushing.com/" rel="nofollow">Code Crushing</a></li>
                <li><a href="http://www.casadocodigo.com.br/pages/politica-de-privacidade" rel="nofollow">Política de Privacidade</a></li>
            </ul>
            <p class="footer-title">Redes Sociais</p>
            <ul>
                <li class="social-links"><a href="http://www.twitter.com/casadocodigo" target="_blank" id="twitter" rel="nofollow">Facebook</a> <a
                    href="http://www.facebook.com/casadocodigo" target="_blank" id="facebook" rel="nofollow">Twitter</a></li>
            </ul>
        </div>
        <div id="newsletter-footer">
            <!-- social-footer -->
            <p class="footer-title">Receba as Novidades e Lançamentos</p>
            <div id="form-newsletter">
                <form action="" method="POST" id="ss-form" class="form-newsletter">
                    <ul>
                        <li><input type="hidden" name="pageNumber" value="0" /><input type="hidden" name="backupCache" value="" /><input type="email"
                            name="entry.0.single" value="" class="ss-q-short" id="entry_0" placeholder="seu@email.com" /></li>
                        <li><input type="submit" name="submit" value="Quero Receber!" id="submit-newsletter" /></li>
                    </ul>
                </form>
                <ul>
                    <li class="ie8"><a href="" rel="nofollow">Receba as Novidades e Lançamentos</a></li>
                </ul>
            </div>
            <ul class="footer-payments">
                <li></li>
                <li></li>
            </ul>
        </div>
    </div>
</footer>

Agora carrinhoCompras:

package br.com.casadocodigo.loja.models;

import java.io.Serializable; import java.math.BigDecimal; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map;

import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.web.context.WebApplicationContext;

@Component @Scope(value=WebApplicationContext.SCOPE_SESSION) public class CarrinhoCompras implements Serializable{

private static final long serialVersionUID = 1L;

private Map<CarrinhoItem, Integer> itens = new LinkedHashMap<>();

public Collection<CarrinhoItem> getItens() {
    return itens.keySet();
}

public void add(CarrinhoItem item) {
    itens.put(item, getQuantidade(item) + 1);
}

public Integer getQuantidade(CarrinhoItem item) {
    if(!itens.containsKey(item)) {
        itens.put(item, 0);
    }
    return itens.get(item);
}

public int getQuantidade() {
    return this.itens.values().stream().reduce(0, 
            (proximo, acumulador) -> proximo + acumulador);
}

public BigDecimal getTotal(CarrinhoItem item) {
    return item.getTotal(getQuantidade(item));
}

public BigDecimal getTotal() {
    BigDecimal total = BigDecimal.ZERO;

    for (CarrinhoItem item : itens.keySet()) {
        total = total.add(getTotal(item));
    }
    return total ;
}

}

Agora o stack de erro parte 1:

État HTTP 500 – Internal Server Error Type Rapport d'exception

message An exception occurred processing [WEB-INF/views/carrinho/itens.jsp] at line [92]

description Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.

exception

org.apache.jasper.JasperException: An exception occurred processing [WEB-INF/views/carrinho/itens.jsp] at line [92]

89:

90: 91:
92:
${carrinhoCompras.getTotal(item) }
93:
94: 95: <input type="image" src="${contextPath }/resources/imagens/excluir.png"

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:607) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:496) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) cause mère

javax.el.ELException: java.lang.NullPointerException javax.el.BeanELResolver.invoke(BeanELResolver.java:164) org.apache.jasper.el.JasperELResolver.invoke(JasperELResolver.java:151) org.apache.el.parser.AstValue.getValue(AstValue.java:159) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:702) org.apache.jsp.WEB_002dINF.views.carrinho.itens_jsp.jspxmeth_c_005fforEach_005f0(itens_jsp.java:414) org.apache.jsp.WEB_002dINF.views.carrinho.itens_jsp.jspService(itensjsp.java:245) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:458) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Stack de erro parte 2:

cause mère

java.lang.NullPointerException br.com.casadocodigo.loja.models.CarrinhoItem.getTotal(CarrinhoItem.java:64) br.com.casadocodigo.loja.models.CarrinhoCompras.getTotal(CarrinhoCompras.java:42) java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.base/java.lang.reflect.Method.invoke(Unknown Source) javax.el.BeanELResolver.invoke(BeanELResolver.java:158) org.apache.jasper.el.JasperELResolver.invoke(JasperELResolver.java:151) org.apache.el.parser.AstValue.getValue(AstValue.java:159) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:702) org.apache.jsp.WEB_002dINF.views.carrinho.itens_jsp.jspxmeth_c_005fforEach_005f0(itens_jsp.java:414) org.apache.jsp.WEB_002dINF.views.carrinho.itens_jsp.jspService(itensjsp.java:245) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:458) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de ce serveur.

Apache Tomcat/9.0.12

Alguém pode me ajudar em relacao a minha duvida?

Opa, Tiago! Desculpe pela demora!

Analisando o log de erro ele diz o seguinte:

java.lang.NullPointerException br.com.casadocodigo.loja.models.CarrinhoItem.getTotal(CarrinhoItem.java:64) 
br.com.casadocodigo.loja.models.CarrinhoCompras.getTotal(CarrinhoCompras.java:42) 

Sendo que o erro original ocorre na linha 92 do arquivo WEB-INF/views/carrinho/itens.jsp que corresponde a:

${carrinhoCompras.getTotal(item)}

Então, o que está ocorrendo é que a JSP chama CarrinhoCompras.getTotal() que por sua vez chama CarrinhoItem.getTotal() e que, por fim, é o local do NullPointerException.

Daí, olhada o método CarrinhoItem.getTotal(), vemos o seguinte:

public class CarrinhoItem {
    private Produto produto;
    private TipoPreco tipoPreco;

    public CarrinhoItem(Produto produto, TipoPreco tipoPreco) {
        this.produto = produto;
        this.tipoPreco = tipoPreco;
    }

    public BigDecimal getPreco() {
        return produto.precoPara(tipoPreco);
    }

    public BigDecimal getTotal(int quantidade) {
        return this.getPreco().multiply(new BigDecimal(quantidade));            
    }

    // restante da classe omitido.
}

Veja que o método getTotal() chama o método getPreco(). Meu palpite é que esse getPreco() está retornando um null e aí quando vc tenta invocar o multiply() vc entra em densas trevas e recebe no colo um NullPointerException.

E aí, pra avaliar o que está ocorrendo, vc precisará olhar para dentro do método precoPara() da classe Produto, pois é ele que está sendo invocado dentro do método getPreco().

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Ola Gabriel, eu dei uma olhada na classe Produto, mas, nao consegui identificar o erro. Vou seguir com o treinamento, acho que terei que ficar com essa pendencia. Muito obrigado pelo tempo e ajuda.

Opa, Tiago! Manda o código da classe aqui! Eu posso dar uma olhada e ver se consigo te ajudar!

Eu comecei o modulo II, importei o projeto que esta disponivel para baixar, mas, o erro persiste. Bom, segue o codigo da classe produto: package br.com.casadocodigo.loja.models;

import java.io.Serializable; import java.math.BigDecimal; import java.util.Calendar; import java.util.List;

import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;

import org.springframework.format.annotation.DateTimeFormat;

@Entity public class Produto implements Serializable{

private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

private String titulo;
private String descricao;
private int paginas;

private String sumarioPath;

@ElementCollection
private List<Preco> precos;

@DateTimeFormat
private Calendar dataLancamento;

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 int getPaginas() {
    return paginas;
}
public void setPaginas(int 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;
}

public Calendar getDataLancamento() {
    return dataLancamento;
}

public void setDataLancamento(Calendar dataLancamento) {
    this.dataLancamento = dataLancamento;
}

public String getSumarioPath() {
    return sumarioPath;
}

public void setSumarioPath(String sumarioPath) {
    this.sumarioPath = sumarioPath;
}

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

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Produto other = (Produto) obj;
    if (id != other.id)
        return false;
    return true;
}

public BigDecimal precoPara(TipoPreco tipoPreco) {
    return precos.stream().filter(preco -> preco.getTipo().equals(tipoPreco))
            .findFirst().get().getValor();
}

}