Salve salve (eu) pessoal.
Sempre fui um observador dessas páginas, mas hoje venho recorrer à vossa ajuda após ler várias threads parecidas e ainda não conseguir resolver o meu problema…
Se puderem me dar um luz, ficarei agradecido.
Após alguns anos afastado da faculdade, estou tentando rodar um projeto JSF (2.2) no TomCat 8.0.
Pois bem, no ambiente do eclipse tudo roda numa boa, porém quando eu exporto o war e tento executar o projeto diretamente pelo tom cat eu recebo o erro abaixo:
javax.servlet.ServletException: /login.xhtml @33,62 value="#{loginMB.login}": Target Unreachable, identifier 'loginMB' resolved to null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
javax.el.PropertyNotFoundException: /login.xhtml @33,62 value="#{loginMB.login}": Target Unreachable, identifier 'loginMB' resolved to null
com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
org.primefaces.util.ComponentUtils.getConverter(ComponentUtils.java:146)
org.primefaces.renderkit.InputRenderer.getConvertedValue(InputRenderer.java:175)
javax.faces.component.UIInput.getConvertedValue(UIInput.java:1045)
javax.faces.component.UIInput.validate(UIInput.java:975)
javax.faces.component.UIInput.executeValidate(UIInput.java:1248)
javax.faces.component.UIInput.processValidators(UIInput.java:712)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
javax.faces.component.UIForm.processValidators(UIForm.java:253)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1261)
javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195)
com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Já conferi o meu “WEB-INF\classes” no webapps e as classes está lá.
A seguir meu web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>missal</display-name>
<welcome-file-list>
<welcome-file>index.jsf</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>afternoon</param-value>
</context-param>
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Axis Admin Servlet</display-name>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
<context-param>
<param-name>primefaces.PUBLIC_CAPTCHA_KEY</param-name>
<param-value>XXXXXXXXXXXXXXX</param-value>
</context-param>
<context-param>
<param-name>primefaces.PRIVATE_CAPTCHA_KEY</param-name>
<param-value>XXXXXXXXXXXXXXX</param-value>
</context-param>
</web-app>
login.xhtml
Summary
<f:facet name="header">
<p:row>
<p:column colspan="2">
<p:outputLabel value="Login" />
</p:column>
</p:row>
</f:facet>
<p:row>
<p:column>
<p:outputLabel for="login" value="Login" />
</p:column>
<p:column>
<p:inputText id="login" value="#{loginMB.login}"
style="width:100%"
required="true"
requiredMessage="Preenchimento obrigatório: Login" />
</p:column>
</p:row>
<p:row>
<p:column>
<p:outputLabel for="senha" value="Senha" />
</p:column>
<p:column>
<p:password id="senha" value="#{loginMB.senha}"
style="width:100%"
required="true"
requiredMessage="Preenchimento obrigatório: Senha" />
</p:column>
</p:row>
<p:row>
<p:column colspan="2">
<div style="margin: 0 auto; width: 304px;">
<p:captcha language="pt-BR" label="Captcha" />
</div>
</p:column>
</p:row>
<f:facet name="footer">
<p:row>
<p:column colspan="2" style="text-align:center">
<p:commandButton value="Entrar" ajax="false"
actionListener="#{loginMB.logar}" />
</p:column>
</p:row>
</f:facet>
</p:panelGrid>
</h:form>
</h:body>
E por fim. o bean
package mis.mBean;
import java.io.IOException;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import mis.seguranca.LoginControl;
import mis.seguranca.RegistraLog;
import mis.util.SessionUtil;
@ManagedBean(name="loginMB")
@ViewScoped
public class LoginMB implements Serializable {
private static final long serialVersionUID = -773831090661639757L;
@ManagedProperty(value="login")
String login;
@ManagedProperty(value="senha")
String senha;
@PostConstruct
public void init() {
//se houver algo na sessão "erroPermissao", então envia uma mensagem à tela
try {
String msg = (String) SessionUtil.getParam("erroPermissao");
if (msg.length() > 0)
FacesContext.getCurrentInstance().addMessage(
null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Erro!", msg));
SessionUtil.remove("erroPermissao");
} catch (NullPointerException e) {
;
}
}
public void logar() {
FacesContext facesContext = FacesContext.getCurrentInstance();
String contexto = facesContext.getExternalContext().getContextName();
int validacao = LoginControl.login(login, senha);
if (validacao > 0) { //login ok
try {
//registra o evento em log
RegistraLog.registraLoginLogout(
1,
((HttpServletRequest) facesContext.getExternalContext().getRequest()).getRemoteAddr(),
validacao,
true);
//redireciona o usuário
facesContext.getExternalContext().redirect("/" + contexto + "/index.jsf");
} catch (IOException e) {
System.err.println("Não foi possível redirecionar o usuário para tela inicial");
}
} else { //erro no login
//registra o evento em log
RegistraLog.registraLoginLogout(
1,
((HttpServletRequest) facesContext.getExternalContext().getRequest()).getRemoteAddr(),
0,
false);
//atribui e exibe mensagem de retorno na tela
String msg = "";
if (validacao == -1) //-1 = campos em branco
msg = "Preencha corretamente todos os campos";
if (validacao == -2 || validacao == -4) //-2 = usuário não encotrado //-4 = senha incorreta
msg = "Usuário e/ou Senha incorretos";
if (validacao == -3) //-3 = usuario ou grupo inativo
msg = "Seu usuário ou o grupo ao qual ele pertence não está ativo";
FacesContext.getCurrentInstance().addMessage(
null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Erro!", msg));
}
}
public int valida() {
FacesContext facesContext = FacesContext.getCurrentInstance();
String contexto = facesContext.getExternalContext().getContextName();
int validacao = LoginControl.valida();
//System.out.println("LoginMB: valida: validacao: " + validacao);
if (validacao < 0) {
try {
if (LoginControl.valida() == -2) { //-2 = usuario ou grupo inativo
facesContext.getExternalContext().redirect("/" + contexto + "/login.jsf");
SessionUtil.setParam("erroPermissao", "Seu usuário ou o grupo ao qual ele pertence não está ativo");
} else if (LoginControl.valida() == -3) { //-3 = sem permissão à tela
facesContext.getExternalContext().redirect("/" + contexto + "/index.jsf");
SessionUtil.setParam("erroPermissao", "Você não tem permissão para acessar essa página");
} else if (LoginControl.valida() == -4) { //-1 = sessão expirada
facesContext.getExternalContext().redirect("/" + contexto + "/login.jsf");
SessionUtil.setParam("erroPermissao", "Sua sessão expirou, faça login novamente");
} else {
facesContext.getExternalContext().redirect("/" + contexto + "/login.jsf");
SessionUtil.setParam("erroPermissao", "Faça login para poder acessar o sistema");
}
} catch (IOException e) {
System.err.println("Não foi possível redirecionar o usuário para tela de login");
}
return 0;
} else
return 1;
}
public void logout() {
//registra o evento em log
RegistraLog.registraLoginLogout(
2,
((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr(),
LoginControl.getCodUserLogado(),
true);
LoginControl.logout();
valida();
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
}