JSF Target Unreachable

hyperion

Bekanntes Mitglied
Hallo,

ich habe hier eine Fehlermeldung bei der ich eigentlich sagen würde "Hey, das ist mal eine Fehlermeldung, bei der man weiß was man zu tun hat.". Die Fehlermeldung lautet:
Code:
javax.el.PropertyNotFoundException: /register.xhtml @28,93 value="#{registerBean.person.address.country}": Target Unreachable, 'null' returned null"
Nun würde ich vermuten, dass ich entweder kein Zugriff auf registerBean habe oder registerBean keinen Zugriff auf address oder address eben keinen Zugriff auf country. Ich hab aber bereits den ganzen Weg überprüft und bin zu dem Schluss gekommen, dass alles passt. Gruml.

Also ich habe eine Seite zum Registrieren:
register.xhtml:
Java:
<?xml version='1.0' encoding='UTF-8' ?>
<!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"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Registrierung</title>
    </h:head>
    <h:body>
        <h:form id="registerForm">
            <h:panelGrid id="registerPanelGrid" columns="2">
                <h:outputText value="Loginname:" />
                <h:inputText id="loginName" value="#{registerBean.user.loginName}" maxlength="45"/>

                <h:outputText value="Passwort:" />
                <h:inputSecret id ="password" value="#{registerBean.user.loginPassword}" maxlength="45"/>

                <h:outputText value="Name:" />
                <h:inputText id="name" value="#{registerBean.person.name}" maxlength="45"/>

                <h:outputText value="Vorname:" />
                <h:inputText id="firstName" value="#{registerBean.person.firstName}" maxlength="45"/>

                <h:outputText value="E-Mail:" />
                <h:inputText id="mail" value="#{registerBean.user.mail}" maxlength="45"/>

                <h:outputText value="Land:" />
                <h:inputText id="country" value ="#{registerBean.person.address.country}" />

                <h:outputText value="Stadt:" />
                <h:inputText id="city" value="#{registerBean.person.address.city}" maxlength="45"/>

                <h:outputText value="Straße:" />
                <h:inputText id="street" value="#{registerBean.person.address.street}" maxlength="45"/>

                <h:outputText value="Hausnummer:" />
                <h:inputText id="houseNumber" value="#{registerBean.person.address.houseNumber}" maxlength="8"/>

                <h:outputText value="Zusatz:" />
                <h:inputText id="additional" value="#{registerBean.person.address.additional}" maxlength="45"/>

                <h:outputText value="Geburtstag:" />
                <h:inputText  id="birthday" value="#{registerBean.person.birthday}">
                    <f:convertDateTime pattern="dd.mm.yyyy"/>
                </h:inputText>
                <h:commandButton id="register" action="#{registerBean.register}" value="Registrieren"  />
            </h:panelGrid>
        </h:form>
    </h:body>
</html>

Auf dieser Seite klicke ich dann auf "Registrieren", dann kommt die entsprechende Fehlermeldung.
Jetzt noch der Code der damit zusammenhängt.
RegisterBean.java
Java:
package beans;

import model.User;
import model.Person;
import hibernate.session.SessionFactoryUtil;
import java.util.Date;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;


@ManagedBean(name="registerBean")
@RequestScoped
public class RegisterBean {

    private Person person = new Person();
    private User user = new User();

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String register(){

       user.setRegisterDate(new Date());
       Transaction tx = null;
       Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
       try {
          tx = session.beginTransaction();
          user.setPerson(person);
          person.setUser(user);
          session.save(person);
          session.save(user);
          tx.commit();
          return "success";
        } catch (RuntimeException e) {
          if (tx != null && tx.isActive()) {
            try {
    // Second try catch as the rollback could fail as well
              tx.rollback();
            } catch (HibernateException e1) {

            }
    // throw again the first exception
            throw e;
          }
        }
       return "failed";
    }
}

Da die Annotation @ManagedBean dabei steht, sollte die Bean doch eigentlich erreichbar sein?

Person.java
Java:
package model;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.validation.constraints.Past;

@Entity
@Table(name="Person")
public class Person implements Serializable{

     @Id
     @Column(name = "Person_ID", nullable = false)
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Integer id;

     @Column(name = "Name", nullable = false)
     private String name;

     @Column(name = "FirstName", nullable = false)
     private String firstName;

     @OneToOne(mappedBy="person")
     private User user;

    @Column(name = "Birthday", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    @Past
    private Date birthday;

    @ManyToOne
    @JoinColumn(name = "Address_ID")
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

Address.java
Java:
package model;

import java.io.Serializable;
import javax.persistence.*;

@Entity
public class Address implements Serializable{

    @Column(name = "Address_ID", nullable = false)
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "Country", nullable = false)
    private String country;

    @Column(name = "City", nullable = false)
    private String city;

    @Column(name = "Street", nullable = false)
    private String street;

    @Column(name = "HouseNumber", nullable = false)
    private String houseNumber;

    @OneToOne(mappedBy="address")
    private Person person;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getHouseNumber() {
        return houseNumber;
    }

    public void setHouseNumber(String houseNumber) {
        this.houseNumber = houseNumber;
    }

    public int getId() {
        return id;
    }

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

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}

StackTrace
Java:
javax.el.PropertyNotFoundException: /register.xhtml @28,93 value="#{registerBean.person.address.country}": Target Unreachable, 'null' returned null
	at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
	at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
	at javax.faces.component.UIInput.validate(UIInput.java:960)
	at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
	at javax.faces.component.UIInput.processValidators(UIInput.java:698)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIForm.processValidators(UIForm.java:253)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
	at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)

Könnt Ihr mir sagen, was ich nun korrigieren muss?

Gruß hyperion
 
S

SlaterB

Gast
> Ich hab aber bereits den ganzen Weg überprüft und bin zu dem Schluss gekommen, dass alles passt.
und wie genau?
funktioniert zunächst ein einfacher Zugriff, wie etwa [c]value="#{registerBean.xy}"[/c] falls entsprechendes Attribut testweise vorhanden?
wie prüfst du anderenfalls, was genau passiert, welche Objekte vorhanden sind?

in diesem Fall wäre möglich, in den getter-Methoden, die ja hoffentlich benutzt werden, zu loggen/ zu debuggen,
wenn als Log ein einfaches System.out.println() nicht reicht, dann evtl. die Info statisch abspeichern oder gar komplett eine Textdatei öffnen und schließen,
die letzten Ausgaben vor der Exception sind die interessantesten

[c]private Person person = new Person();[/c]
ein frisch initialisiertes RegisterBean mit dieser Person hat doch gewiss keine Adresse in der Person?
 
Zuletzt bearbeitet von einem Moderator:

mvitz

Top Contributor
Richtig. Abhilfe schafft da immer das folgende "Pattern"

Person.java
Java:
...
public Person() {
    this.address = new Address();
}
...
 

hyperion

Bekanntes Mitglied
Hallo,

vielen Dank. Irgendwie habe ich das übersehen, dass das gar nicht erzeugt wurde.

Den Weg habe ich überprüft, indem ich manuell den Code nachgegangen bin.

Gruß hyperion
 

Ähnliche Java Themen

Neue Themen


Oben