Estoy tratando de escribir un servlet personalizado (para AJAX / JSON) en el que me gustaría hacer referencia a mi @ManagedBeans
nombre. Espero mapear:
http://host/app/myBean/myProperty
a:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
¿Es posible cargar un bean por su nombre desde un servlet normal? ¿Hay un servlet JSF o un ayudante que pueda usar?
Parece que me echó a perder la primavera en la que todo esto es demasiado obvio.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Konrad Garus
fuente
fuente
Respuestas:
En un artefacto basado en servlet, como
@WebServlet
,@WebFilter
y@WebListener
, puede obtener un JSF "simple"@ManagedBean @RequestScoped
de la siguiente manera:y
@ManagedBean @SessionScoped
por:y
@ManagedBean @ApplicationScoped
por:Tenga en cuenta que esto requiere que el bean ya sea creado automáticamente por JSF de antemano. De lo contrario, estos volverán
null
. Luego, necesitaría crear manualmente el bean y usarsetAttribute("beanName", bean)
.Si puede usar CDI en
@Named
lugar de JSF 2.3 en desuso@ManagedBean
, entonces es aún más fácil, particularmente porque ya no necesita crear manualmente los beans:Tenga en cuenta que esto no funcionará cuando esté usando
@Named @ViewScoped
porque el bean solo puede ser identificado por el estado de vista JSF y eso solo está disponible cuandoFacesServlet
se ha invocado. Entonces, en un filtro que se ejecuta antes de eso, acceder a un@Inject
ed@ViewScoped
siempre arrojaráContextNotActiveException
.Solo cuando estés dentro
@ManagedBean
, puedes usar@ManagedProperty
:Tenga en cuenta que esto no funciona dentro de una
@Named
o@WebServlet
o cualquier otro artefacto. Realmente funciona@ManagedBean
solo por dentro .Si no está dentro de a
@ManagedBean
, peroFacesContext
está disponible (es decirFacesContext#getCurrentInstance()
, no regresanull
), también puede usarApplication#evaluateExpressionGet()
:que puede ser conveniente de la siguiente manera:
y se puede utilizar de la siguiente manera:
Ver también:
fuente
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
está disponible aunque elstatic
método de utilidadfindBean()
esté definido dentro de una clase Java simple. ¿Cómo está disponible allí en una clase Java simple que no está administrada por JSF?Utilizo el siguiente método:
Esto me permite obtener el objeto devuelto por escrito.
fuente
Class
argumento es innecesario en esta construcción).¿Has probado un enfoque como el de este enlace? No estoy seguro de si
createValueBinding()
todavía está disponible, pero un código como este debería ser accesible desde un Servlet antiguo. Esto requiere que el bean ya exista.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
fuente
Puede obtener el bean administrado pasando el nombre:
fuente
Tenía el mismo requisito.
He utilizado la siguiente forma para obtenerlo.
Tenía bean con alcance de sesión.
He usado el siguiente código en mi método servlet doPost ().
resolvió mi problema.
fuente
Yo uso esto:
Y luego llama:
De esta manera, puede refactorizar su código y realizar un seguimiento de los usos sin problemas.
fuente