N vezes o mesmo objeto com JSF

3 respostas
bdoweb

Olá pessoal,

Seguinte vou tentar ilustra meu problema. Estou montando um exemplinho básico para mim aprender ....

Seguinte tenho objeto Person(username,password,age,description) um obejto contato (typePhone, ddd,phone) que se relaciona em 1:n com person ...

Meu backbean até o momento está assim:

public class BackBeanData {
	private Person person;
	private Collection<Contact> contacts = new ArrayList<Contact>();

	public BackBeanData(){
		Contact contact = new Contact();
		contact.setTypePhone("celular");
		contact.setDdd(11);
		contact.setPhone("86748116");
		contact.setPerson(person);
		contacts.add(contact);
	}
	
	public String save() {
		try {
			EntityManagerFactory factory = Persistence.createEntityManagerFactory("meindica");
			EntityManager manager = factory.createEntityManager();
			EntityTransaction tx = manager.getTransaction();
			
			tx.begin();
			
			Contact contact2 = new Contact();
			contact2.setTypePhone("residencial");
			contact2.setDdd(11);
			contact2.setPhone("55236094");
			contact2.setPerson(person);
			
			contacts.add(contact2);
			
			person.setContact(contacts);
			
			manager.persist(person);
			tx.commit();
			return "ok";
		}
		catch (Exception e) {
			return "error";
		}
	}
	/* GETTERS AND SETTERS */
}

Bom como tenho um relacionamento de 1:n entre Person e Contact na minha página com o JSF eu queria receber esses dados .... Ou seja .... Quero fazer um JavaScript que fique repetindo os campos do formulario com informações de contato ..... E que esses campos preenchidos se tornem parte do minha collection contacts .....

Bom meu faces-config.xml é o seguinte :
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">
    <managed-bean>
        <managed-bean-name>person</managed-bean-name>
        <managed-bean-class>br.com.meindica.entity.Person</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>name</property-name>
            <value>&lt;Here your name&gt;</value>
        </managed-property>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>contacts</managed-bean-name>
        <managed-bean-class>java.util.ArrayList</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <list-entries>
                <value-class>java.util.ArrayList</value-class>
                <null-value />
            </list-entries>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>backBeanData</managed-bean-name>
        <managed-bean-class>br.com.meindica.backbean.BackBeanData</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        
        <managed-property>
            <property-name>person</property-name>
            <value>#{person}</value>
        </managed-property>
        
        <managed-property>
            <property-name>contacts</property-name>
            <value>#{contacts}</value>
        </managed-property>
    </managed-bean>
</faces-config>

E por enquanto meu html com os facelets é o seguinte:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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 HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Cadastro de contatos</title>
</head>
<body>
    <f:view>
        <h:form id="teste">
            <h1>Person data</h1>
            <h:panelGrid columns="2">
                 <h:outputLabel value="Username: " for="username" /><h:inputText value="#{person.username}" id="username" />
                 <h:outputLabel value="Password: " for="password" /><h:inputSecret value="#{person.password}" id="password" />
                 <h:outputLabel value="Name: " for="name" /><h:inputText value="#{person.name}" id="name" />
                 <h:outputLabel value="Age: " for="age" /><h:inputText value="#{person.age}" id="age" />
                 <h:outputLabel value="Description: " for="Description" /><h:inputText value="#{person.description}" id="Description" />
            </h:panelGrid>
            
            <h2>Contact data</h2>
            <h:panelGrid columns="2">
               <h:outputLabel value="Type Phone: " for="type_fone" /><h:inputText value="#{contacts[2].typePhone}" id="type_fone" />
               <h:outputLabel value="DDD: " for="ddd" /><h:inputText value="#{contacts[2].ddd}" id="ddd" />
               <h:outputLabel value="Phone: " for="Phone" /><h:inputText value="#{contacts[2].phone}" id="Phone" />
               <h:commandButton action="#{backBeanData.save}" value="Save" />             
            </h:panelGrid>
             
        </h:form>
    </f:view>
</body>
</html>

Mas quando eu executo esse código recebo a seguinte stack

May 7, 2008 1:28:22 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute WARNING: /signup.jsp(24,69) '#{contacts[2].typePhone}' Target Unreachable, '2' returned null org.apache.jasper.el.JspPropertyNotFoundException: /signup.jsp(24,69) '#{contacts[2].typePhone}' Target Unreachable, '2' returned null at org.apache.jasper.el.JspValueExpression.getType(JspValueExpression.java:61) at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:129) at javax.faces.component.UIInput.getConvertedValue(UIInput.java:936) at javax.faces.component.UIInput.validate(UIInput.java:861) at javax.faces.component.UIInput.executeValidate(UIInput.java:1071) at javax.faces.component.UIInput.processValidators(UIInput.java:663) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1040) at javax.faces.component.UIForm.processValidators(UIForm.java:229) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1040) at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:667) at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) May 7, 2008 1:28:22 PM com.sun.faces.lifecycle.LifecycleImpl phase WARNING: executePhase(PROCESS_VALIDATIONS 3,com.sun.faces.context.FacesContextImpl@1958cc2) threw exception javax.faces.FacesException: /signup.jsp(24,69) '#{contacts[2].typePhone}' Target Unreachable, '2' returned null at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:108) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) Caused by: org.apache.jasper.el.JspPropertyNotFoundException: /signup.jsp(24,69) '#{contacts[2].typePhone}' Target Unreachable, '2' returned null at org.apache.jasper.el.JspValueExpression.getType(JspValueExpression.java:61) at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:129) at javax.faces.component.UIInput.getConvertedValue(UIInput.java:936) at javax.faces.component.UIInput.validate(UIInput.java:861) at javax.faces.component.UIInput.executeValidate(UIInput.java:1071) at javax.faces.component.UIInput.processValidators(UIInput.java:663) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1040) at javax.faces.component.UIForm.processValidators(UIForm.java:229) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1040) at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:667) at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100) ... 15 more

Bom pessoal espero que alguém possa me ajudar fico muito grato

3 Respostas

K

cara
eu lembro que recebi uma vez esse erro, se nao me engano ou era por que eu estava acessando um objeto que era privado ou se o objeto nao estava instanciado!
nao posso te dar certeza, mas era algo desse tipo.

outra coisa que pode estar acontecendo, se for o seu codigo estiver fazendo o que pensei, é, como vc usou o [N] ele o rornou o array certo?
pode ser que nao exista o registro de numero 2 no array?
tente usar com 0 e veja oq acontece

outra coisa
#                <h:outputLabel value="Type Phone: " for="type_fone" /><h:inputText value="#{contacts[2].typePhone}" id="type_fone" />  
#                <h:outputLabel value="DDD: " for="ddd" /><h:inputText value="#{contacts[2].ddd}" id="ddd" />  
#                <h:outputLabel value="Phone: " for="Phone" /><h:inputText value="#{contacts[2].phone}" id="Phone" />

po curiosidade, na parte "contacts[2].phone" o 2 seria o numero do array mesmo, como eu pensei?

falow
T+

bdoweb

Então cara o 2 é sim da posição do array … eu coloquei o 2 pois no backbean eu adicionou mais 2 elementos na arraylist …

Quando eu coloquei o zero o erro foi o mesmo …

felipeguerra

Mim não aprende, mim ser pele vermelha?

Criado 7 de maio de 2008
Ultima resposta 8 de mai. de 2008
Respostas 3
Participantes 3