Problemas com Struts 2.1.6 + Tiles 2.1.4 + xercesImpl 2.9.1

2 respostas
F

Olá,

Estou tendo um problema com esses 3 carinhas: Struts 2.1.6, Tiles 2.1.4 e xercesImpl 2.9.1.
O que está acontecendo é o seguinte:
A aplicação compila sem problemas, não ocorre nenhum erro na inicialização do tomcat, a tela de login aparece normalmente, mas ao efetuar o login aparece a exception abaixo e ao voltar para a tela de login e efetuar o login novamente, a aplicação funciona normalmente.

Percebi que se eu tirar o xercesImpl da jogada, as coisas funcionam como deveriam... na primeira tentativa de login com sucesso, já aparece a home do usuário. Porém, ao colocar novamente o xercesImpl, e reiniciar o servidor, ferra tudo novamente. E é só na primeira tentativa de login... :shock:

Segue abaixo o trace gerado:
[2010-07-05 03:59:13] ERROR (Digester:getParser:789) - Digester.getParser: 
 java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
	at javax.xml.parsers.SAXParserFactory.setXIncludeAware(SAXParserFactory.java:448)
	at org.apache.commons.digester.Digester.getFactory(Digester.java:534)
	at org.apache.commons.digester.Digester.getParser(Digester.java:786)
	at org.apache.commons.digester.Digester.getXMLReader(Digester.java:1058)
	at org.apache.commons.digester.Digester.parse(Digester.java:1887)
	at org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:325)
	at org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO.loadDefinitionsFromURL(BaseLocaleUrlDefinitionDAO.java:274)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:237)
	at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadParentDefinitions(ResolvingLocaleUrlDefinitionDAO.java:58)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:225)
	at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.loadParentDefinitions(ResolvingLocaleUrlDefinitionDAO.java:58)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitionsFromURLs(CachingLocaleUrlDefinitionDAO.java:225)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.loadDefinitions(CachingLocaleUrlDefinitionDAO.java:207)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.checkAndloadDefinitions(CachingLocaleUrlDefinitionDAO.java:190)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinitions(CachingLocaleUrlDefinitionDAO.java:153)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:121)
	at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:55)
	at org.apache.tiles.definition.UrlDefinitionsFactory.getDefinition(UrlDefinitionsFactory.java:104)
	at org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:363)
	at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:617)
	at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:322)
	at org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:105)
	at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
	at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:361)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:265)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.fernando.nissizaki.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:26)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
A princípio, até pensei que fosse o interceptor que eu tenho, mas tirando o interceptor tb dá no mesmo. Segue abaixo o código:
public class LoginInterceptor extends AbstractInterceptor {
	private static final long serialVersionUID = 1L;
	private static final String USER_HANDLE = "user";

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		final ActionContext context = invocation.getInvocationContext ();
	    HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
	    HttpSession session =  request.getSession (true);
	    
	    Object user = session.getAttribute(USER_HANDLE);
	    if(!StringUtils.isBlank(request.getParameter("doLogin"))) {
    		return invocation.invoke ();
    	}  
	    if(user == null) {
	    	return "index";
	    } else {
	    	return invocation.invoke ();
	    }
	}
	
}

Se alguém tiver alguma idéia, agradeço muito.
OBS: preciso usar o xerces por questão de compatibilidade com outras aplicações que ficarão nesse pacote.

2 Respostas

jyoshiriro

Posta o código da Action. Talvez ajude.

F

Action

public class LoginAction extends ActionSupport {
	private UserBean user;

	public UserBean getUser() {
		return user;
	}

	public void setUser(UserBean user) {
		this.user = user;
	}
	
	public String execute() {
		String retValue = "input";
		try {
			HttpServletRequest request = ServletActionContext.getRequest();
			HttpSession session = request.getSession(false);
			Object user = new UserDAO().validadeLogin(request.getParameter("user.username"), request.getParameter("user.password"));
			
			if(user != null) {
				session.setAttribute("user", user);
				new UserDAO().updateLastLoginDate((UserBean)user);
				retValue =  SUCCESS;
			}
		} catch (Exception e) {
			e.printStackTrace();
			addActionError("Ocorreu um erro ao tentar efetuar o login.");
		}
		return retValue;
	}
	
	public void validate(){
		boolean hasEmpty = false;
		if(StringUtils.isBlank(getUser().getUsername())) {
			addActionError("Informe o campo \"Usuário\".");
			hasEmpty = true;
		}
		if(StringUtils.isBlank(getUser().getPassword())) {
			addActionError("Informe a \"Senha\".");
			hasEmpty = true;
		}
		if(!hasEmpty) {
			HttpServletRequest request = ServletActionContext.getRequest();
			HttpSession session = request.getSession(false);
			Object user = null;
			try {
				user = new UserDAO().validadeLogin(request.getParameter("user.username"), request.getParameter("user.password"));
			} catch (SQLException e) {
				e.printStackTrace();
				addActionError("Erro no acesso à base de dados.");
			}
			if(user != null) {
				session.setAttribute("user", user);
			} else {
				addActionError("Usuário e/ou Senha inválido(s).");
			}
		}
	}
}

struts.xml

<struts>
	<constant name="struts.ui.theme" value="simple" />
	<constant name="struts.multipart.maxSize" value="5242880" />

	<package name="default" extends="struts-default">
		<result-types>
			<result-type name="tiles"
				class="org.apache.struts2.views.tiles.TilesResult" />
		</result-types>

		<interceptors>
			<interceptor name="login" class="LoginInterceptor" ></interceptor>
			<interceptor-stack name="loginStack">
                <interceptor-ref name="login" />
                <interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		
		<default-interceptor-ref name="loginStack" />
		<default-action-ref name="index" />

		<global-results>
			<result name="index">/jsps/main/login.jsp</result>
		</global-results>

		<action name="index">
			<result>/jsps/main/login.jsp</result>
		</action>

		<action name="doLogin"
			class="LoginAction">
			<result name="input">/jsps/main/login.jsp</result>
			<result name="success" type="tiles">home</result>
		</action>

	</package>
</struts>

Grato.

Criado 5 de julho de 2010
Ultima resposta 6 de jul. de 2010
Respostas 2
Participantes 2