Galera, me deem uma ajuda aqui!
Estou tentando passar o código da empresa do Usuário Logado para o meu Bean Cidade porém não estou conseguindo.
Estou utilizando o Bean Autenticação para recuperar as informações do usuário logado, mas de que forma eu consigo passar isso para o meu Bean na hora de salvar a Cidade?
public void salvar() {
try {
empresa = (Empresa) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("chave");
cidade.setEmpresa(empresa);
CidadeDAO cidadeDAO = new CidadeDAO();
cidadeDAO.merge(cidade);
cidade = new Cidade();
EstadoDAO estadoDAO = new EstadoDAO();
estados = estadoDAO.listar();
cidades = cidadeDAO.listar();
Messages.addGlobalInfo("Cidade salva com sucesso");
} catch (RuntimeException erro) {
Messages.addFlashGlobalError("Ocorreu um erro ao tentar salvar uma nova cidade");
erro.printStackTrace();
}
}
Erro
java.lang.ClassCastException: java.lang.String cannot be cast to br.com.riverp.d
omain.Empresa
at br.com.riverp.Bean.CidadeBean.salvar(CidadeBean.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpress
ionActionListener.java:149)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
at javax.faces.component.UICommand.broadcast(UICommand.java:300)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhas
e.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
va:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase
.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141
)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogVa
lve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Proce
ssor.java:1099)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(Abstrac
tProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.jav
a:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:
1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.ja
va:61)
at java.lang.Thread.run(Unknown Source)
mai 10, 2019 1:13:39 PM com.sun.faces.context.flash.ELFlash setCookie
ADVERTÊNCIA: JSF1095: The response was already committed by the time we tried to
set the outgoing cookie for the flash. Any values stored to the flash will not
be available on the next request.
mai 10, 2019 1:14:31 PM org.apache.catalina.core.StandardContext reload
INFORMAÇÕES: Reloading Context with name [/Riverp] has started
mai 10, 2019 1:14:31 PM org.apache.catalina.session.StandardSession doWriteObjec
t
É, de alguma forma isso não funciona, passei o fds todo atrás de respostas, exemplos e documentação mas nada que ajude.
A cidade é salva normalmente, mas a chave estrangeira não é preenchida, é como esse FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("chave", "valor"); não retornasse valor algum. Ou se está retornando não está sendo acessado pelo outro MB. Enfim, vou procurar outra solução porque essa para mim não funcionou. Obrigado pela atenção!
Você esta com o código que eu sugeri ainda ou já apagou?
Se tiver, posta ai para eu ver como você fez, pois antes você estava passando uma EL no bean e lá EL não funciona
@ManagedBean
@SessionScoped
public class AutenticacaoBean {
private Usuario usuario;
private Usuario usuarioLogado;
public Usuario getUsuarioLogado() {
return usuarioLogado;
}
public void setUsuarioLogado(Usuario usuarioLogado) {
this.usuarioLogado = usuarioLogado;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
@PostConstruct
public void inciar() {
usuario = new Usuario();
usuario.setPessoa(new Pessoa());
}
public void autenticar() {
try {
UsuarioDAO usuariodao = new UsuarioDAO();
usuarioLogado = usuariodao.autenticar(usuario.getPessoa().getCpf(), usuario.getSenha());
if(usuarioLogado == null) {
Messages.addGlobalError("CPF ou Senha incorretos");
return;
}
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("chave", usuario.getEmpresa());
Faces.redirect("./pages/principal.xhtml");
}catch(IOException erro){
erro.printStackTrace();
}
}
public boolean temPermissoes(List<String>permissoes) {
for(String permissao : permissoes) {
if(usuarioLogado.getTipo() == permissao.charAt(0)) {
return true;
}
}
return false;
}
}
cidadeBean (método Salvar)
public void salvar() {
empresa = (Empresa) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("chave");
try {
cidade.setEmpresa(empresa);
CidadeDAO cidadeDAO = new CidadeDAO();
cidadeDAO.merge(cidade);
cidade = new Cidade();
EstadoDAO estadoDAO = new EstadoDAO();
estados = estadoDAO.listar();
cidades = cidadeDAO.listar();
Messages.addGlobalInfo("Cidade salva com sucesso");
} catch (RuntimeException erro) {
Messages.addFlashGlobalError("Ocorreu um erro ao tentar salvar uma nova cidade");
erro.printStackTrace();
}
}
Já printou no console ou debugou pra ver se não esta vindo mesmo?
De qualquer forma, tem outras soluções:
1- Injetar o seu AutenticacaoBean no seu cidadeBean através de @ManagedProperty ou @Named(Caso esteja usando CDI)
2- Passar o objeto do AutenticacaoBean como parametro do método no actionListener