Erro javax.el.PropertyNotFoundException. Aplicação Spring MVC + JSTL

19 respostas
jspjpahibernatespringjava
T

Boa tarde pessoal, preciso de uma ajuda com este problema. Estou seguindo o ebook da Casa do Código, Spring MVC.
O erro acontece quando tento cadastrar um novo Product. Salva todos os campos, menos o BookType.
Segue códigos utilizados:

Classe Produtct

@Entity
public class Product {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String title;
	@Lob
	private String description;
	private int pages;
	@ElementCollection
	private List<Price> prices = new ArrayList<Price>();

	public Integer getId() {
		return id;
	}

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

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public int getPages() {
		return pages;
	}

	public void setPages(int pages) {
		this.pages = pages;
	}

	public List<Price> getPrices() {
		return prices;
	}

	public void setPrices(List<Price> prices) {
		this.prices = prices;
	}

Classe Price

@Embeddable
public class Price {
	@Column(scale = 2)
	private BigDecimal value;
	private BookType bootType;

	public BigDecimal getValue() {
		return value;
	}

	public void setValue(BigDecimal value) {
		this.value = value;
	}

	public BookType getBootType() {
		return bootType;
	}

	public void setBootType(BookType bootType) {
		this.bootType = bootType;
	}

Enum BookType

public enum BookType {
	EBOOK,PRINTED,COMBO
}

19 Respostas

T

Segue a tela em JSP:
Tela de Cadastro de Product
<c:forEach items="${types}" var="bookType" varStatus="status"> <div> <label for="price_${bookType}">${bookType}</label> <input type="text" name="prices[${status.index}].value" id="price_${bookType}"/> <input type="hidden" name="prices[${status.index}].bookType" value="${bookType}"/> </div> </c:forEach>

E

Olá @thiago.antunes,

O problema está no mapeamento de um Enum, pois em JPA um Enum deve ter a anotação javax.persistence.Enumerated, então a classe Price ficaria dessa maneira.

@Embeddable
public class Price {

@Column(scale = 2)
private BigDecimal value;
@Enumerated
private BookType bootType;

public BigDecimal getValue() {
	return value;
}

public void setValue(BigDecimal value) {
	this.value = value;
}

public BookType getBootType() {
	return bootType;
}

public void setBootType(BookType bootType) {
	this.bootType = bootType;
}

}

public enum BookType { EBOOK,PRINTED,COMBO }

para mais informação leia o seguinte contéudo do link: http://tomee.apache.org/examples-trunk/jpa-enumerated/README.html

T

@emanuelbatista
Apesar de o meu código estar exatamente igual ao do ebook, eu também já fiz esta alteração (inclusive especificando ORDINAL ou STRING) e o problema continua, o value é salvo e o campo bookType é salvo com null.

E

Qual banco de dados você está usando?

T

@emanuelbatista
Estou utilizando MySQL.

E

Tente remover todas as tabelas, reinicie a aplicações e teste novamente.
pode ser problema de mapeamento.

T

@emanuelbatista
Então, eu já tentei isso.
Olhei e tornei a olhar o código e não vejo nada de errado. O problema ainda persiste.

E

Você debugou o código?

T

Já sim, aparentemente não está setando o valor da variável booType, porém eu não consegui identificar o motivo, pois os métodos get e set existem. Aparentemente as expressões na página JSP estão corretas também, não vi nada de errado.

E

mande o código do controller para ver se tem algum error.

T
`@Controller

@Transactional

@RequestMapping("/produtos")

public class ProductsController {
@Autowired
private ProductDAO productDAO;

@RequestMapping(method = RequestMethod.POST)
public String save(Product product){
	productDAO.save(product);
	return "products/form";
}

@RequestMapping("/form")
public ModelAndView form(){
	ModelAndView mv = new ModelAndView("products/form");
	mv.addObject("types", BookType.values());
	return mv;
}

@RequestMapping(method = RequestMethod.GET)
public ModelAndView list(){
	ModelAndView mv = new ModelAndView("products/list");
	mv.addObject("products", productDAO.list());
	return mv;
}`
E

Ao adicionar, um BookType dá algum problema?

T

Sim, esta mensagem do título do tópico, dizendo que a propriedade bookType não pode ser encontrada.

E

Mande a stack da exception.

T

O erro é mostrado na hora que acesso a página de listagem.

`out 17, 2016 3:58:53 PM org.apache.catalina.core.ApplicationDispatcher invoke

GRAVE: Servlet.service() for servlet jsp threw exception

javax.el.PropertyNotFoundException: Property bookType not found on type br.com.casadocodigo.loja.models.Price

at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:268)

at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:221)

at javax.el.BeanELResolver.property(BeanELResolver.java:355)

at javax.el.BeanELResolver.getValue(BeanELResolver.java:95)

at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)

at org.apache.el.parser.AstValue.getValue(AstValue.java:169)

at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)

at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943)

at org.apache.jsp.WEB_002dINF.views.products.list_jsp._jspx_meth_c_005fforEach_005f1(list_jsp.java:232)

at org.apache.jsp.WEB_002dINF.views.products.list_jsp._jspx_meth_c_005fforEach_005f0(list_jsp.java:184)

at org.apache.jsp.WEB_002dINF.views.products.list_jsp._jspService(list_jsp.java:135)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)

at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)

at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)

at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)

at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)

at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)
out 17, 2016 3:58:53 PM org.apache.catalina.core.StandardWrapperValve invoke

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [javax.el.PropertyNotFoundException: Property ‘bookType’ not found on type br.com.casadocodigo.loja.models.Price] with root cause

javax.el.PropertyNotFoundException: Property bookType not found on type br.com.casadocodigo.loja.models.Price

at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:268)

at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:221)

at javax.el.BeanELResolver.property(BeanELResolver.java:355)

at javax.el.BeanELResolver.getValue(BeanELResolver.java:95)

at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)

at org.apache.el.parser.AstValue.getValue(AstValue.java:169)

at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)

at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943)

at org.apache.jsp.WEB_002dINF.views.products.list_jsp._jspx_meth_c_005fforEach_005f1(list_jsp.java:232)

at org.apache.jsp.WEB_002dINF.views.products.list_jsp._jspx_meth_c_005fforEach_005f0(list_jsp.java:184)

at org.apache.jsp.WEB_002dINF.views.products.list_jsp._jspService(list_jsp.java:135)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)

at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)

at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)

at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)

at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)

at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)`
E

Duas coisas.

No banco esse valor do bookType é preenchido.
E se por favor mande o código da página de listagem para que posso ver algum error.

T

No banco o valor bookType não é preenchido.

list.jsp
<c:forEach items="${products}" var="product"> <tr> <td>${product.title}</td> <td> <c:forEach items="${product.prices}" var="price"> [${price.value} - ${price.bookType}] </c:forEach> </td> </tr> </c:forEach>

E

Não vejo problema nessa solução aparentimente.

  1. A única solução que vejo é apagar todas as tablas do banco.
  2. Colocar a anotação @Enumerated.
  3. E depois reiniciar a aplicação e testar.
T

Bom dia @emanuelbatista,
Eu já tentei todas estas opções e não resolvi ainda, estou quase louco aqui já,rs

Criado 17 de outubro de 2016
Ultima resposta 18 de out. de 2016
Respostas 19
Participantes 2