Soy bastante nuevo en JSF y en realidad, no «utiliza» a la forma de pensar diferente, así que estoy luchando en lo que (supongo) es básico.

Digamos que tengo una clase de Usuario, que es un bean de sesión.

Digamos que tengo un controlador de 10000 objetos, a decir de la Fábrica, que debe ser capaz de establecer algunos de ellos como «bloqueado», en nuestro caso significa que el «bloqueado» el campo no se convierta en nulo, sino hacer referencia a un «LockedItem» objeto.

Aquí es donde yo no puedo conseguir que las cosas funcionen : LockedItem, cuando usted instancias de ella, se supone que para hacer referencia al usuario que ha iniciado sesión actualmente. Cómo se supone que voy a hacer eso ?

Traté de inyección con @managedproperty, pero es nulo en LockedItem.constructor (lo cual es normal, supongo) entonces traté en un @PostConstruct método, pero ese método nunca se llama (¿por qué ? Incluso si me hacen un managedbean… son los postconstruct métodos sólo se llama cuando el objeto es creado por el «.xhtml» ?)
O debo usar un «java se» truco, como hacer que el Usuario estática ?


Código para aclarar por qué es un @PostConstruct no se llama (el de «Asiento») :

.xhtml

<h:outputLabel id="user" value="Hello #{user.name}" />
<h:outputLabel id="car" value="you have #{car.brand}" />

Usuario

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class User implements Serializable {
    private String name ;

    public User()
    {
        name = "toto"; 
        System.out.println("User constructor");
    }

    public String getName() {
        return name;
    }

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


}

Coche

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Car implements Serializable {
    private String brand ;
    private Seat seat ;

    public Car()
    {
        brand = "audi" ;
        seat = new Seat();
        System.out.println("Car constructor") ;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }


}

Asiento

package test;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean
public class Seat implements Serializable {
    private int nb ;
    private String userName ;

    @ManagedProperty("#{user}")
    private User user ;

    public Seat()
    {
        nb = 4 ;
        userName="na";
        System.out.println("! Seat constructor ") ;
    }

    @PostConstruct
    public void init()
    {
        System.out.println("!! Seat postconstruct : "+user.getName());
    }

    public User getUser() {
        return user;
    }

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

    public int getNb() {
        return nb;
    }

    public void setNb(int nb) {
        this.nb = nb;
    }
}

Gracias !

InformationsquelleAutor Qualaelay | 2012-09-07

1 Comentario

  1. 5

    La @PostConstruct es el camino correcto.

    No se si crear una instancia del bean usando new operador (obviamente). Se llama sólo si JSF crea y gestiona el grano en sí cuando se hace referencia por primera vez en EL contexto como #{bean}. De hecho, esto sucede generalmente en la vista lateral, pero esto también puede ocurrir en el modelo del controlador de lado por @ManagedProperty("#{bean}") o Aplicación#evaluateExpressionGet().

    Que no debe hacer el User estática. Sería compartida applicationwide, no sessionwide.

    Una alternativa es simplemente pasar la corriente User como argumento de constructor de LockedItem, o para invocar el método de inicialización de mismo, para asegurarse de si la clase no representa un legítimo JSF backing bean en todos.

    • Gracias BalusC ! He probado todo esto en una pequeña prueba, y todavía parece que no puede obtener el PostConstruct de una clase («Asiento») llamado el uso de la @ManagedProperty, ¿de casualidad tienes alguna idea de lo que está mal en mi código (publicado como respuesta) ? (Tenga en cuenta que se llama de hecho si tengo <h:outputLabel id=»asiento» value=»usted tiene #{asiento.nb}» asientos />)
    • Usted debe tener un @ManagedProperty("#{seat}") en lugar de new Seat().
    • De acuerdo a sus soluciones, todavía tengo un «patrón» problema porque en realidad de lo abstracto. En mi caso concreto, tengo un LibraryObject que es abstracto y define una implementación por defecto para el bloqueo de un objeto (que es la asociación de un LockedItem). LockedItem debe saber quién es el User (bean de sesión) para obtener su nombre. Inicialmente, ni LibraryObject ni LockedItem son los frijoles. La mejor manera de hacerlo ya que parece que el LibraryObject un managedBean en el que me inyecte el User y, como usted ha dicho, crear un nuevo LockedItem dando la User de referencia, pero no puedo desde su resumen… Alguna idea ?

Dejar respuesta

Please enter your comment!
Please enter your name here