Estou tentando escrever um servlet personalizado (para AJAX / JSON) no qual gostaria de fazer referência ao meu @ManagedBeans
nome. Espero mapear:
http://host/app/myBean/myProperty
para:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
É possível carregar um bean por nome de um servlet regular? Existe um servlet JSF ou auxiliar que eu possa usar para isso?
Parece que estou estragado pela primavera, em que tudo isso é muito óbvio.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Konrad Garus
fonte
fonte
Respostas:
Em um artefato baseado em servlet, tais como
@WebServlet
,@WebFilter
e@WebListener
, você pode pegar um JSF "plain vanilla"@ManagedBean @RequestScoped
por:e
@ManagedBean @SessionScoped
por:e
@ManagedBean @ApplicationScoped
por:Observe que isso exige que o bean já tenha sido autocreado pelo JSF de antemão. Caso contrário, eles retornarão
null
. Em seguida, você precisará criar manualmente o bean e usá-losetAttribute("beanName", bean)
.Se você for capaz de usar o CDI em
@Named
vez do JSF 2.3 obsoleto@ManagedBean
, então é ainda mais fácil, especialmente porque você não precisa mais criar manualmente os beans:Observe que isso não funcionará quando você estiver usando,
@Named @ViewScoped
porque o bean só pode ser identificado pelo estado de exibição JSF e isso só está disponível quando oFacesServlet
foi chamado. Portanto, em um filtro que roda antes disso, acessar um@Inject
ed@ViewScoped
sempre será lançadoContextNotActiveException
.Somente quando você estiver dentro
@ManagedBean
, você pode usar@ManagedProperty
:Note que isso não funciona dentro de um
@Named
ou@WebServlet
ou qualquer outro artefato. Ele realmente funciona@ManagedBean
apenas no interior .Se você não estiver dentro de um
@ManagedBean
, mas oFacesContext
estiver disponível (ou sejaFacesContext#getCurrentInstance()
, não retornarnull
), você também pode usarApplication#evaluateExpressionGet()
:que pode ser conveniente da seguinte forma:
e pode ser usado da seguinte forma:
Veja também:
fonte
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
está disponível mesmo que ostatic
método do utilitáriofindBean()
seja definido dentro de uma classe Java simples. Como ele está disponível em uma classe Java simples que não é gerenciada por JSF?Eu uso o seguinte método:
Isso me permite obter o objeto retornado de uma maneira digitada.
fonte
Class
argumento é, nomeadamente, desnecessário neste construto).Você tentou uma abordagem como neste link? Não tenho certeza se
createValueBinding()
ainda está disponível, mas um código como este deve ser acessível a partir de um Servlet antigo simples. Isso exige que ele já exista.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
fonte
Você pode obter o bean gerenciado passando o nome:
fonte
Eu tinha o mesmo requisito.
Usei a maneira abaixo para obtê-lo.
Eu tinha um bean com escopo de sessão.
Usei o código abaixo em meu método doPost () de servlet.
resolveu meu problema.
fonte
Eu uso isso:
E então ligue para:
Desta forma, você pode refatorar seu código e rastrear usos sem problemas.
fonte