# JSF, Primefaces - NullPointerException



## Ducksoul (5. Sep 2012)

Hallo Leute,
ich habe ein Problem beim Speichern von Benutzerdaten in der Datenbank. Und zwas bekomme ich immer eine NullPointerException nachdem der Converter des SelectOneMenus durchlaufen wurde. Schmeiße ich das SelectOneMenu raus, dann kommt auch keine Exception mehr..

View:

```
...
                            <h:outputLabel value="Passwort" for="password" />
                            <p:password id="password" value="#{personenController.selected.passwort}" />

                            <h:outputLabel value="Rolle" for="rolle" />
                            <p:selectOneMenu id="rolle" value="#{personenController.selected.rolleID}" >
                                <f:selectItems value="#{rollenController.getItemsAvailableSelectOne()}" />
                            </p:selectOneMenu>
                        </h:panelGrid>  
                        <br />
                        <h:commandButton value="Änderungen speichern" 
                                         id="saveChanges"
                                         action="#{personenController.saveChanges}"
                                         />
                    </p:panel>
                </p:fieldset
```

Converter:

```
@FacesConverter(forClass = Rollen.class)
    public static class RollenControllerConverter implements Converter {
         public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            RollenController controller = (RollenController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "rollenController");
            Rollen test = controller.findByRole(value);
            return test;
//            return controller.findByRole(value);
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Rollen) {
                Rollen o = (Rollen) object;
                return o.getRolle();
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ProdukteController.class.getName());
            }
        }
    }
```

Beim Debuggen ist mir aufgefallen, dass der Converter das richtige Objekt zurück gibt. Erst nach der Methode getConvertedValue von Primefaces knallt es... Hat da vielleicht jemand eine Idee?


----------



## F.S.WhiTeY (5. Sep 2012)

Moin,

wo soll denn bitte die Methode 
	
	
	
	





```
rollenController.getItemsAvailableSelectOne()
```
 sein? Ich finde die in deinem Code nicht! Deinen Personal Controller sehe ich auch nicht. Du musst uns schon die wichtigen schnippeds posten.


----------



## Ducksoul (5. Sep 2012)

Entschuldige bitte.. Ich habe die Methoden die ich für mich schon ausgeschlossen hatte vergessen mit zu posten..

getItemsSelectOne() und abhängige:

```
public SelectItem[] getItemsAvailableSelectOne() {
        if (JsfUtil.isSuperAdmin()) {
            return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
        } else {
            List<Rollen> roles = new ArrayList();
            roles.add(ejbFacade.findByRole("Monteur"));
            return JsfUtil.getSelectItems(roles, false);
        }
    }

    public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
        int size = selectOne ? entities.size() + 1 : entities.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        for (Object x : entities) {
            items[i++] = new SelectItem(x, x.toString());
        }
        return items;
    }
```

PersonalController:

```
@ManagedBean(name = "personenController")
@SessionScoped
public class PersonenController implements Serializable {

    private Personen current;
    private List<Personen> persList = new ArrayList();
    @EJB
    private com.wincor.hwinventory.session.PersonenFacade ejbFacade;
    private boolean disabled = true;
    private boolean editable = false;

    public PersonenController() {
    }

    public boolean isDisabled() {
        return disabled;
    }

    public void setDisabled(boolean disabled) {
        this.disabled = disabled;
    }

    public boolean isEditable() {
        return editable;
    }

    public void setEditable(boolean editable) {
        this.editable = editable;
    }
       
    public List<Personen> getPersList() {
        return persList;
    }
    
    public void sePersList(List<Personen> persList) {
        this.persList = persList;
    }
    
    public void updatePersList() {  
        List<Personen> list = ejbFacade.findAll();
        this.persList = list;
    }

    public Personen getSelected() {
        return current;
    }
    
    public void setSelected(Personen pers) {
        current = pers;
    }

    private PersonenFacade getFacade() {
        return ejbFacade;
    }

    public String prepareList() {
        updatePersList();
        return "/personalverwaltung";
    }

    public void prepareCreate() {
        current = new Personen();
        current.setMonteurID(999);
        
        editable = true;
    }

    public void create() {
        try {
            current.setPasswort(EncryptPassword.SHA256(current.getPasswort()));
            getFacade().create(current);
            Util.addSuccessMessage("Erfolg: ", current.getVorname() + " " + current.getName() + " wurde erfolgreich der Datenbank hinzugefügt.");
        } catch (Exception e) {
            Util.addErrorMessage("Fehler: ", "Beim Hinzufügen der Person zur Datenbank ist ein Fehler aufgetreten.");
        }
    }

    public void prepareEdit() {
        editable = true;  
    }

    public void update() {
        try {
            getFacade().edit(current);
            Util.addSuccessMessage("Erfolg: ", "Die Person wurde erfolgreich aktualisiert.");
        } catch (Exception e) {
            Util.addErrorMessage("Fehler: ", "Beim Aktualisieren der Person ist ein Fehler aufgetreten.");
        }
    }
    
    public void saveChanges() {
        if(Validators.isValidPerson(current)) {
            if(current.getMonteurID() == 999) {
                create();
            } else {
                update();
            }
            updatePersList();
            editable = false;
        } else {
            updatePersList();
        }
    }    

    public String destroy() {
        performDestroy();
        editable = false;
        return prepareList();
    }

    private void performDestroy() {
        try {
            getFacade().remove(current);
            current = null;
            disabled = true;
            Util.addSuccessMessage("Erfolg: ", "Die Person wurde erfolgreich gelöscht.");
        } catch (Exception e) {
            Util.addErrorMessage("Fehler: ", "Beim Löschen der Person ist ein Fehler aufgetreten.");
        }
    }
    
    public void onSelect(final SelectEvent se) {
        editable = false;
        if(current != null) disabled = false;
    }
    
    public void onUnselect() {
        editable = false;
        if(current == null) disabled = true;
    }    
    
    public List<Personen> findAll() {
        return ejbFacade.findAll();
    }
    
    public Personen findPersByUsername(String name) {
        return ejbFacade.findByUsername(name);
    }
   
    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }
    
    @FacesConverter(forClass = Personen.class)
    public static class PersonenControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            PersonenController controller = (PersonenController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "personenController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Personen) {
                Personen o = (Personen) object;
                return getStringKey(o.getMonteurID());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + RollenController.class.getName());
            }
        }
    }        
}
```


----------



## Ducksoul (7. Sep 2012)

Sieht der Code bis jetzt soweit in Ordnung aus?


----------



## Sym (7. Sep 2012)

Steht da nur Nullpointer? Was sagt denn der Stacktrace?


----------



## JimPanse (7. Sep 2012)

Ducksoul hat gesagt.:


> Beim Debuggen ist mir aufgefallen, dass der Converter das richtige Objekt zurück gibt. Erst nach der Methode getConvertedValue von Primefaces knallt es... Hat da vielleicht jemand eine Idee?



Ich vermute das die equals()-Methode nicht in den Enitäten implementiert ist (wird intern aufgerufen).


----------



## Ducksoul (7. Sep 2012)

Es gibt keinen Stacktrace()..

Angezeigt wird lediglich:
The server encountered an internal error () that prevented it from fulfilling this request.

NullPointerException


----------



## Ducksoul (7. Sep 2012)

Hallo nochmal,

ich kann immernoch nicht genau sagen wo der Fehler liegt/lag. Ich konnte ihn auf die getSelectItem-Methode eingrenzen. Erstaunlicherweise zeigt die Primesfaces-Komponente bei der Methode die Objekte an, die Standard-JSF-Combobox jedoch nicht.
Ich habe jetzt eine eigene getSelectItem-Methode geschrieben (die andere war durch Netbeans generiert) und es läuft.

Wenn ich später Zeit habe um das weiter zu debuggen gebe ich nochmal kurz Meldung.

Gruß


----------

