Problema no IoC do WW usando o artigo do Guj =(

Pessoal,

estou tentando fazer o exemplo de login em Webwork de um artigo aqui do GUJ e esta dando erro. O IoC não esta funcionando, bem, como no artigo, tenho o components.xml no classpath da app:

<components>
    <component>
        <scope>session</scope>
        <class>com.foo.component.UserSession</class>
        <enabler>com.foo.component.UserSessionAware</enabler>
    </component>
</components>

a interface UserSessionAware:

package com.foo.component;

public interface UserSessionAware {

	public void setUserSession( UserSession userSession );
	
	public UserSession getUserSession();
}

o UserSession:

package com.foo.component;

import com.foo.model.User;

public class UserSession implements java.io.Serializable {

	private User user;

	public void setUser( User user ) {
		this.user = user;
	}
	
	public User getUser() {
		return user;
	}

}

e a SystemAction, q implementa a UserSessionAware e tem um UserSession:

package com.foo.action;

import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.ModelDriven;

import com.foo.component.UserSession;
import com.foo.component.UserSessionAware;

public abstract class SystemAction extends ActionSupport
	implements ModelDriven, UserSessionAware {

	protected UserSession userSession;

	protected SystemAction() { }

	public void setUserSession( UserSession userSession ) {
		this.userSession = userSession;
	}
	
	public UserSession getUserSession() {
		return userSession;
	}

	public abstract Object getModel();

}

e aqui esta o erro, na action de login q usa esse userSession herdado da SystemAction para setar o User qnd o login estiver certo:

package com.foo.action;

import com.foo.model.User;

public class LoginAction extends SystemAction
	implements DisableSecurityAction {

	private User model = new User();

	public String execute() {
		
		if ( !model.getUsername().equals( "matheus" ) ) {
			
			addActionError( "Ocorreu um erro" );
			addFieldError( "username", "Usuário inválido" );
			return ERROR;
		}

		if ( !model.getPassword().equals( "matheus" ) ) {
			
			addActionError( "Ocorreu um erro" );
			addFieldError( "password", "Senha inválida" );
			return ERROR;
		}

		this.userSession.setUser( model );

		return SUCCESS;
	}

	public Object getModel() {
		return model;
	}

}

ok, mas na linha this.userSession.setUser( model ) esta estourando uma NPE, então a conclusão q cheguei foi q o IoC não ta funfando… alguém pode me ajudar? :roll:

No teu webwork-default.xml tem isso aqui?

<interceptor-stack name="defaultStack">
	<interceptor-ref name="component" />

a classe do component ta definida no webwork-default.xml já

<interceptors>
   ...
   <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
   ...
</interceptors>

e no xwork.xml eu tenho essa pilha:

<interceptors>
	<interceptor name="appsecurity" class="com.foo.interceptor.ApplicationSecurityInterceptor"/>

	<interceptor-stack name="systemDefaultStack">
		<interceptor-ref name="model-driven"/>
		<interceptor-ref name="component"/>
		<interceptor-ref name="appsecurity"/>
		<interceptor-ref name="validationWorkflowStack"/>
		<interceptor-ref name="logger"/>
		<interceptor-ref name="timer"/>
	</interceptor-stack>
</interceptors>

e deixo como interceptor default:

<default-interceptor-ref name="systemDefaultStack"/>

Ei Matheus,

Já parou para ver as facilidades e maravilhas que a integração do Webwork e o Spring te provê? Esqueça a dimensão do Spring e seus tão ditos frameworks a parte. Trabalhando apenas com o core dele você consegue maravilhas na injeção de componentes e beans.

Olá Lucas,

Onde eu posso encontrar algum bom material sobre Spring, com exemplos práticos da sua aplicação (em especial sobre sua integração com Webwork, que me interessa bastante…)

Obrigado!

[quote=J2Alex]Olá Lucas,

Onde eu posso encontrar algum bom material sobre Spring, com exemplos práticos da sua aplicação (em especial sobre sua integração com Webwork, que me interessa bastante…)

Obrigado![/quote]

E ai Alex,

Cara, é tudo mto simples de se trabalhar. Este nível de integração que propus, apenas usa o core do Spring Framework. No caso, vai usar a DI (Dependency Injection) para injetar os teus beans (prefiro tratar como ‘componentes’).

Então como isso? Você tem o teu applicationContext (vulgo appCtx) onde mapeia os tais componentes injetáveis (que na verdade poderão ser implementações de teus DAOs, poderão ser recursos externos ou até tuas próprias actions). Define também o modo com que a aplicação se amarra (wiring) entre os componentes e manda ver. A integração xwork-spring faz tudo isso. (=

[quote=Lucas Teixeira]Ei Matheus,

Já parou para ver as facilidades e maravilhas que a integração do Webwork e o Spring te provê? Esqueça a dimensão do Spring e seus tão ditos frameworks a parte. Trabalhando apenas com o core dele você consegue maravilhas na injeção de componentes e beans.

[/quote]

Sim mas a minha intenção não é usar o Spring, é conseguir colocar pra rodar o exemplo do WW que esta no artigo do Guj. Eu pessoalmente nem iria usar o IoC, mas como consta no artigo, fiquei encucado de não ter coseguido fazer funcionar :roll:, ai apelei pra ajuda.

Lucas,

Que vantagens eu tenho em utilizar Spring com Webwork?

Um exemplo, eu mapearia minhas actions no appCtx desta forma:

<bean id="SpringAction" class="br.com.lucastex.action.SpringAction" singleton="false" />

Bingo, aí no xwork:

<action name="exemplo" class="SpringAction"> <result name="success" type="velocity">ok.vm</result> </action>

Isso faz com que qdo ele procure a classe “SpringAction” ele vá até o appCtx e veja qual a classe definida. Isso até por luxo, dá para fazer com Interceptors e outras coisas…

O + legal, é definir na tua action os atributos, no caso:

private IDaoUsuario daoUsuario;

Aí você define nova tag no appCtx.

<bean id="usuarioDao" class="br.com.lucastex.dao.hibernate.UsuarioDao" singleton="false" />

Pronto, isso vai ser injetado automaticamente, (desde que é claro, hibernate.UsuarioDao seja uma implementacao de IUsuarioDao).

Bom, a questão não é a vantagem de se utilizar o Spring com o Webwork, e sim a Dependecy Injection para isso aí. Poderia ser com outro fwk de Ioc, no caso até o Pico… Mas a integração dele me deixa feliz (integracao = definir o nome e as classes dos beans que serão injetados e não ter uma nullpointer).

Em resumo é isso, tenha o atributo com o mesmo nome da definicao do bean (autowire by name), tenha o atributo na classe com teu set e bingo!!!

Ai um dia eu vou mudar toda a persistencia de hibernate para JDBC, o que faco? Crio novos Daos que implementam as interfaces (IUsuarioDao) e apenas vou no meu appCtx e digo que essa referencia agora recebe uma implementacao via JDBC, no caso:

<bean id="usuarioDao" class="br.com.lucastex.dao.jdbc.UsuarioDao" singleton="false" />

Lindo né (;

é legal trabalhar baseado em componentes tb… Tipo, o conceito de componente já diz que é algo plugável na aplicação. Então trabalhe um pouco mais as ‘classes’ deixe elas bem modularizadas e ‘plugaveis’, e faça componentes para o teu sistema! Pluge-os com o Spring!

(;

Valeu Lucas! Vou dar uma pesquisada no Spring. :slight_smile:

óh, e agora, quem poderá me ajudar :expressionless:

Você editou o web.xml ?!? Tem que adicionar os listeners:

[code]
com.opensymphony.webwork.lifecycle.SessionLifecycleListener

com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener [/code]

[quote=smota]Você editou o web.xml ?!? Tem que adicionar os listeners
[/quote]

Quem melhor do que o autor do artigo nessas horas :D… smota, os 2 listeners estão no meu web.xml sim. :roll:

Ja conseguiu?

Se nao foi ainda. Qual a ordem que ta o teu web.xml?

]['s

fab, se a ordem tá errada dá erro na inicialização.

(‘fab’ XD)

[quote=LIPE]fab, se a ordem tá errada dá erro na inicialização.

(‘fab’ XD)[/quote]

Quando tive esse problema nao dava erro nao. :cry:

O uq eé: (‘fab’ XD) ? :roll:
]['s

[quote=fabgp2001] Ja conseguiu?

Se nao foi ainda. Qual a ordem que ta o teu web.xml?

]['s[/quote]

Ainda não foi, não tive tempo de mecher mais, mas… essa é a ordem:

<?xml version="1.0" ?>
&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;

&lt;web-app&gt;

   &lt;listener&gt;
      &lt;listener-class&gt;com.foo.arch.Initializer&lt;/listener-class&gt;
   &lt;/listener&gt;

   &lt;listener&gt;
      &lt;listener-class&gt;com.opensymphony.webwork.lifecycle.SessionLifecycleListener&lt;/listener-class&gt;
   &lt;/listener&gt;

   &lt;listener&gt;
      &lt;listener-class&gt;com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener&lt;/listener-class&gt;
   &lt;/listener&gt;

   &lt;servlet&gt;
      &lt;servlet-name&gt;webwork&lt;/servlet-name&gt;
      &lt;servlet-class&gt;com.opensymphony.webwork.dispatcher.ServletDispatcher&lt;/servlet-class&gt;
      &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
   &lt;/servlet&gt;

   &lt;servlet-mapping&gt;
      &lt;servlet-name&gt;webwork&lt;/servlet-name&gt;
      &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;
   &lt;/servlet-mapping&gt;

   &lt;taglib&gt;
      &lt;taglib-uri&gt;webwork&lt;/taglib-uri&gt;
      &lt;taglib-location&gt;/WEB-INF/lib/webwork-2.1.7.jar&lt;/taglib-location&gt;
   &lt;/taglib&gt;

&lt;/web-app&gt;

Bem, aparentemente, não há problemas então começamos a seção chutes.

Ops, antes dos chutes vale investigar fazendo:

:arrow: Beba da fonte e certifique-se de estar realmente tudo no lugar.

:arrow: Ative o log (log4j) em modo DEBUG e coloque a saída aqui, os interceptors logam o que estão fazendo, deve dar alguma luz.

Depois nós começamos a chutar … tive problemas com IoC em uma versão específica do Tomcat e tentei de todo modo achar o problema mas não consegui (debugando o Xwork mesmo), tente outra :wink:

eu ja estou cavocando na fonte a um tempinho mesmo… e bem, se tu teve problemas com um Tomcat, hum… meu container é o BEA WebLogic com service pack 3, só oque faltava ser por causa do container :?