que managedbean ejemplo bean anotaciones annotation java jsf jsf-2 managed javabeans

java - managedbean - @ManagedProperty(value=“#{param.id}”) en un bean de alcance no solicitado



managed-bean-scope (2)

Necesito pasar un parámetro (POST) a un @managedBean, usé propiedades administradas como esta:

@ManagedProperty(value = "#{param.id}") private int id;

Y el alcance del Bean es ViewScope.

Termino con este error:

No se puede crear el recibo de bean administrado. Se encontraron los siguientes problemas: - El alcance del objeto al que hace referencia la expresión # {param.id}, solicitud, es más corto que el alcance de referencia de los beans gestionados administrados

¿Que puedo hacer?

Arjan echa un vistazo:

Mi página: Título de Facelet

<form method="post" action="faces/index.xhtml"> <input name="id" value="4" /> <input type="submit" value="submit" /> </form> <h:form> <h:commandLink value="click" action="index"> <f:param id="id" name="id" value="20"/> </h:commandLink> </h:form>


Como alternativa a capturar los parámetros directamente de la solicitud en su bean, puede usar los view parameters .

Estos deben declararse en el Facelet en el que utiliza su bean administrado de la siguiente manera:

<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:body> <f:metadata> <f:viewParam id="id" name="id" value="#{myBean.id}" /> </f:metadata> <!-- Rest of Facelet here --> </h:body> </html>

Si ahora solicita esta página, se llamará al establecedor del bean de respaldo con el valor de solicitud proporcionado para el parámetro id. Esto funciona tanto para las solicitudes GET como para las solicitudes POST (sin caras).

La ventaja es que puede utilizar los convertidores y validadores JSF estándar aquí. Por supuesto, si su bean administrado no está vinculado a una vista particular, entonces esta solución es menos ideal.

Una pequeña cosa peculiar a tener en cuenta es que cuando se hace una devolución de datos de caras normales después de la solicitud inicial que proporcionó el parámetro de vista, se llamará nuevamente al establecedor en su bean, incluso si el bean está en el ámbito de visualización y no hay ningún valor nuevo explícitamente previsto.

Para probar que esto funciona, he usado el siguiente bean administrado:

import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import javax.faces.event.ActionEvent; @ManagedBean @ViewScoped public class MyBean { Long id; @PostConstruct public void test() { System.out.println("post construct called"); } public void actionMethod(ActionEvent event) { System.out.println("action called"); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }

Y el siguiente Facelet:

<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:body> <f:metadata> <f:viewParam id="id" name="id" value="#{myBean.id}" /> </f:metadata> <h:outputText value="#{myBean.id}"/> <h:form> <h:commandButton value="test" actionListener="#{myBean.actionMethod}"/> </h:form> <form method="post"> <input name="id" value="4" /> <input type="submit" value="submit" /> </form> </h:body> </html>

Ingrese un número en el campo de entrada y haga clic en el botón enviar. Si el número se imprime de nuevo en la pantalla, la prueba ha tenido éxito. Tenga en cuenta que el segundo formulario es un formulario regular y no publica ningún estado JSF a lo largo. He probado esto en JBoss AS 6 y funciona. Probar el parámetro id como un parámetro GET también funciona.


Dos caminos:

  1. Realice el alcance de la solicitud de bean e inyecte la vista con el alcance de otro como @ManagedProperty .

    @ManagedBean @RequestScoped public class RequestBean { @ManagedProperty(value="#{param.id}") private Integer id; @ManagedProperty(value="#{viewBean}") private ViewBean viewBean; }

    El bean de ámbito de vista está disponible durante @PostConstruct y los métodos de acción del bean de ámbito de solicitud. Solo debe tener en cuenta que la id puede perderse cuando realiza una devolución a la misma vista sin el parámetro.

  2. O, agárrelo manualmente desde el mapa de parámetros de solicitud durante la inicialización del bean.

    @ManagedBean @ViewScoped public class ViewBean { private Integer id; @PostConstruct public void init() { id = Integer.valueOf(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")); } }

    De esta manera, la id inicial está disponible durante todo el alcance de la vista.