JPA e JSF Help!

2 respostas
G

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;
	}
}

2 Respostas

G

Consegui resolver, em meu MBeam ao invés de utilizar a annotation @PersistContext deve-se utilizar @Resource(name=“jsfjpa2”), pois o tomcat não reconhece a annotation @PersistContext.

anderson.bonavides

Kra q anotações são essas do teu managed bean?
Ta lembrando mais uma classe de persistencia.

Criado 5 de junho de 2008
Ultima resposta 6 de jun. de 2008
Respostas 2
Participantes 2