Pregunta

He visto las otras preguntas con respecto a llamar a un constructor de frijoles y visor, y todavía tengo dificultades. El problema que estoy viendo involucra dos páginas específicas en mi solicitud. El primero es un DataTable (por ahora, se llena con datos generados al azar, pero eventualmente llamará a una base de datos), la segunda página es una página de visualización bastante simple en la que la información de la fila seleccionada se muestra en un formulario para la edición o la visualización. Esta es mi página de detail.xhtml. Es el frijol para esta página que es el problema; Su constructor se llama dos veces: Primero, cuando navego a la página, nuevamente cuando presiono el comandoButton, ya sea que se envíe cambios o cambios de cancelación, no importa, el constructor de Beans de Detalle.xhtml se llama una segunda vez.

Mi frijol es @ViewScoped, importando javax.faces.bean.ViewScoped. Algunos otros detalles que podrían hacer una diferencia, pero si lo hacen, no entiendo por qué: mi userdetailbean.java hereda de un frijol base (que originalmente llamo Uibasebean.java). Ahora, mi Uibasebean es @RequestScoped. Como entiendo, esto no debería hacer una diferencia porque mi userdetailbean es @ViewScoped, corrígeme si me equivoco.

El otro detalle que podría hacer una diferencia es la configuración de una variable en el constructor tanto del Uibasebean como del UserDetailBean. Quiero mostrar la ubicación del usuario en una barra de herramientas en la parte superior de mis páginas. Para ese fin, creé una variable en Uibasebean:

protected String toolbarDescription;

También proporcioné al Setter y Getter en Uibasebean. En el constructor de Uibasebean, defino la variable:

toolbarDescription = "fix me";

Esa definición es solo para que sepa anular la variable en el frijol de respaldo para cualquier página en particular en mi solicitud. En mi UserDetailBean, asigna un nuevo valor a la compañía de herramientas de cadena. Este valor se muestra en la página de detalle.xhtml. De lo contrario, el frijol para mi página de detalle.xhtml es muy simple, obtiene y establece propiedades para la visualización de datos en el formulario en la página de detalle.xhtml.

Se configura la página de detalles para que la navegación se realice con una redirección y la navegación a distancia (cuando se presiona el botón de comandos) ocurre con una redirección. He intentado usar las reglas de navegación FACES-CONFIG con y sin redirecciones, y la navegación implícita con y sin redirecciones, pero el constructor de utenseDetailbean siempre se llama dos veces.

Oh, configuré un punto de interrupción en la variable de tareas de herramientas en My UserDetailbean Constructor, que detiene el programa dos veces: cuando la página se llama primero, y nuevamente después de presionar el botón de comandos en la página de detalles.

De lo que he descrito, ¿puede alguien decirme por qué mi constructor se llama dos veces? ¿Diseñé mi frijol incorrectamente, o es el problema más profundo en mi solicitud?

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import [package name].UIBaseBean;    
import java.util.Locale;
import javax.faces.bean.ManagedProperty;


@ManagedBean
@ViewScoped

public class UserDetailBean extends UIBaseBean {

@ManagedProperty(value = "#{param.action}")
private String action;

private String firstName;
private String lastName;
private String jobTitle;
private String DOH;
private String location;
private String status;
private String comments;
@ManagedProperty(value = "#{param.id}")
private String id;
private String tabTitle;

private boolean editMode;
private boolean viewMode;

private ClUserDetail dBUserDetail;      

    /** Creates a new instance of UserDetailBean */
    public UserDetailBean() {   
        toolbarDescription = CoreMsgBundle.getMessageFromResourceBundle("UserDetail", Locale.ENGLISH);
    }

¿Fue útil?

Solución

Debe eliminar el @RequestScoped y otras anotaciones relacionadas del UIBaseBean (y convertirlo en abstract).

Una vez hecho esto, también necesita arreglar el @ManagedProperty en #{param} para que sea definido por <f:viewParam> o para ser obtenido por ExternalContext#getRequestParameterMap() en su lugar.Es decir, no es posible inyectar algo que tiene un alcance más corto en algo que tiene un alcance más grande (porque no está claro cuál debe inyectarse ya que puede haber más de ellos durante el alcance del aceptador).JSF lanzaría una excepción durante la construcción del bean.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top