Olá Pessoal,
Estou criando uma aplicação que utilize JPA e JSF, pesquisei alguns exemplos no google e acabei construindo minha aplicação conforme o artigo do Urubatan, estou utilizando tomcat 6 + java 6 e jsf 1.2.
Tambem copiei os arquivos do toplink para a pasta lib do tomcat e editei o arquivo annotations-api.jar conforme explicado no artigo.
Ao executar minha aplicação(http://localhost:8080/lojateste/home.jsf) surge o seguinte erro:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: An error occurred performing resource injection on managed bean clienteBean
javax.faces.webapp.FacesServlet.service(FacesServlet.java:270)
root cause
com.sun.faces.mgbean.ManagedBeanCreationException: An error occurred performing resource injection on managed bean clienteBean
com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:227)
com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:109)
com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:368)
com.sun.faces.mgbean.BeanManager.create(BeanManager.java:230)
com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:88)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:61)
org.apache.el.parser.AstValue.getValue(AstValue.java:103)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186
Alguem aqui já passou por isso?
Segue abaixo os arquivos de configuração:
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<navigation-rule>
<navigation-case>
<from-outcome>home</from-outcome>
<to-view-id>/home.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>clienteBean</managed-bean-name>
<managed-bean-class>br.com.comercioglobal.loja.mbean.ClienteMBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
mbeam
package br.com.comercioglobal.loja.mbean;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import br.com.comercioglobal.loja.data.Cliente;
public class ClienteMBean {
@PersistenceContext(name = "jsfjpa2")
private EntityManager em;
private List<Cliente> clientes;
private Cliente cliente;
private Long codigo;
public List<Cliente> getClientes() {
return clientes;
}
public void setClientes(List<Cliente> clientes) {
this.clientes = clientes;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
@PostConstruct
public void init() {
if (codigo != null)
cliente = em.find(Cliente.class, codigo);
else cliente = new Cliente();
list();
}
@SuppressWarnings("unchecked")
private void list() {
clientes = em.createQuery("select c from Cliente c").getResultList();
}
@PreDestroy
public void destroy() {
}
public String save() {
EntityTransaction t = em.getTransaction();
t.begin();
if (cliente.getCodigo() == null) {
em.persist(cliente);
} else {
em.merge(cliente);
}
t.commit();
return "home";
}
public String delete() {
EntityTransaction t = em.getTransaction();
t.begin();
if (cliente.getCodigo() != null) {
Cliente c = em.getReference(Cliente.class, cliente.getCodigo());
em.remove(c);
}
t.commit();
return "home";
}
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="jsfjpa">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
<!-- All persistence classes must be listed -->
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<!-- Provider-specific connection properties -->
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="toplink.jdbc.url" value="jdbc:mysql://localhost/lojateste" />
<property name="toplink.jdbc.user" value="root" />
<property name="toplink.jdbc.password" value="root" />
<!-- Provider-specific settings -->
<property name="toplink.logging.level" value="INFO" />
<!--java2db properties -->
<property name="toplink.ddl-generation" value="create-tables" />
</properties>
</persistence-unit>
</persistence>
home.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</head>
<body>
<f:view>
<h:form>
<h:inputHidden value="#{clienteBean.cliente.codigo}" />
<h:panelGrid columns="3">
<h:outputLabel for="name" value="Nome" />
<h:inputText id="name" value="#{clienteBean.cliente.nome}" />
<h:message for="name" />
</h:panelGrid>
<h:outputLink value="home.jsf">
<h:outputText value="Novo" />
</h:outputLink>
<h:commandLink value="Salvar" action="#{clienteBean.save}" />
<h:commandLink value="Deletar" action="#{clienteBean.delete}" />
<!--<h:dataTable value="#{clienteBean.clientes}" var="c">
<h:column>
<f:facet name="header">
<h:outputText value="Id" />
</f:facet>
<h:outputLink value="home.jsf">
<f:param name="codigo" value="#{c.codigo}" />
<h:outputText value="#{c.codigo}" />
</h:outputLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{c.nome}" />
</h:column>
</h:dataTable>-->
</h:form>
</f:view>
</body>
</html>
context.xml
<Context path="lojateste"
docBase="C:/Arquivos de programas/eclipse/workspace/JSFJPA/WebContent">
<Resource auth="Container"
factory="br.com.comercioglobal.loja.util.PersistenceManagerObjectFactory"
name="jsfjpa2"
type="javax.persistence.EntityManagerFactory"
unitName="jsfjpa" />
</Context>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Loja Virtual</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
PersistenceManagerObjectFactory
package br.com.comercioglobal.loja.util;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.spi.ObjectFactory;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.naming.ResourceRef;
public class PersistenceManagerObjectFactory implements ObjectFactory {
private String unitName;
private static Map<String, EntityManagerFactory> factoryMap = new HashMap<String, EntityManagerFactory>();
public String getUnitName() {
return unitName;
}
public void setUnitName(String unitName) {
this.unitName = unitName;
}
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
RefAddr un = ((ResourceRef) obj).get("unitName");
EntityManagerFactory emf = getFactory((String) un.getContent());
return emf.createEntityManager();
}
private EntityManagerFactory getFactory(String unitName) {
EntityManagerFactory factory = factoryMap.get(unitName);
if (factory == null) {
factory = Persistence.createEntityManagerFactory(unitName);
factoryMap.put(unitName, factory);
}
return factory;
}
}