Vraptor4 - Não consigo receber objeto populado na volta do @AroundCall usando @Inject e @Intercepts

Boa noite,

Estou tendo problemas em receber os valores do controller preenchidos ao usar o Intercept do Vraptor4:

@Intercepts
@RequestScoped
public class SessionInterceptor {

	@Inject	private Result result;	
	@Inject	private Validator validator;	
	@Inject	private Environment environment;	
	@Inject	private Session session;
	@Inject	private HttpServletRequest request;	
	@Inject	private HttpSession javaSession;
	
	@AroundCall
	public void intercept ( SimpleInterceptorStack stack ) {
		if (!session.isNew()) {
			result.include( "isLogged", session.isLogged( ) );
			result.include( "clientName", session.getClientName( ) );
		}
		
		javaSession = request.getSession();
		if (!javaSession.isNew()) {
			Session sessionTemp = (Session) javaSession.getAttribute("session");
			
			if (sessionTemp != null && !session.isNew()) {
				session = sessionTemp;
			} else if (sessionTemp == null && session.isNew()) {
				session = new Session();			
			} else {
				javaSession.setAttribute("session", session);
			}
		} else {
			session = new Session();
		}

		System.out.println( "Intercept enter: " + request.getRequestURI( ) );
		
		stack.next();
		
		javaSession.setAttribute("session", session);
		
		System.out.println( "Intercept exit: " + request.getRequestURI( ) );
	}	
}

@Controller	
public class IndexController {

	@Inject private Result result;
	@Inject private Environment environment;
	@Inject private Validator validator;
	@Inject private Session session;

	@Path( "/" )	
	public void index( ) {
		if (session.isNew()) {
			session.setNew(false);
			if(session.getLanguage() == null) {
				session.setLanguage("pt");
				System.out.println(Locale.getDefault()); 
			}
		
			if (session.getApplication() == null) {
				session.setApplication(Application.valueOf(environment.get("application").toUpperCase()));
			}
		}
	}
}

Os valores no Interceptor depois do stack.next() do session sempre chegam vazios. Já tentei de tudo e não consigo resolver.

Sua classe “Session” ta com qual escopo?

No caso ela estava sem escopo. Depois de varias cabeçadas, eu entendi como o @SessionScoped funciona e retirei toda a parte do codigo que guardava o objeto na sessão, passou a utilizar o mesmo objeto no Intercept e no Controller. Mas ainda assim eu altero os valores do objeto no controller e parece que nada é alterado. Ficou assim:

@Intercepts
@RequestScoped
public class SessionInterceptor {
	@Inject	private Result result;	
	@Inject	private Validator validator;	
	@Inject	private Environment environment;	
	@Inject	private Session session;
	@Inject	private HttpServletRequest request;	
	
	@AroundCall
	public void intercept ( SimpleInterceptorStack stack ) {		
		result.include( "isLogged", session.isLogged( ) );
		result.include( "clientName", session.getClientName( ) );

		System.out.println( "Intercept enter: " + request.getRequestURI( ) );
		
		stack.next();
		
		System.out.println( "Intercept exit: " + request.getRequestURI( ) );
	}	
}

@SessionScoped
@Named
public class Session implements Serializable {

	private static final long serialVersionUID = -7570728337923557920L;
	private String clientName;
	private boolean isLogged;
	private String clientEmail;
	private Application application;
	private String language;
	
	public String getClientName() {
		return clientName;
	}
	public void setClientName(String clientName) {
		this.clientName = clientName;
	}
	public boolean isLogged() {
		return isLogged;
	}
	public void setLogged(boolean isLogged) {
		this.isLogged = isLogged;
	}
	public String getClientEmail() {
		return clientEmail;
	}
	public void setClientEmail(String clientEmail) {
		this.clientEmail = clientEmail;
	}
	public Application getApplication() {
		return application;
	}
	public void setApplication(Application application) {
		this.application = application;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
}

@Controller	
public class IndexController {

	@Inject private Result result;
	@Inject private Environment environment;
	@Inject private Validator validator;
	@Inject private Session session;

        @Path( "/" )	
	public void index( ) {
			if(this.session.getLanguage() == null) {
				this.session.setLanguage("pt");
				System.out.println(Locale.getDefault()); 
			}
		
			if (this.session.getApplication() == null) {
				this.session.setApplication(Application.valueOf(environment.get("application").toUpperCase()));
			}
	}
}

Bom, realizei um teste aqui e aparentemente esta tudo funcionando, mas pelo que percebi no seu código, não tem nada verificando se o objeto session foi preenchido corretamente, tenta colocar um “System.out.println(session.getLanguage())” apos o “stack.next()” e verifica no console.

Eu fiz varios testes aqui e ele sempre vinha vazio. A unica maneira de conseguir que ele fosse preenchido corretamente foi colocando Static nos atributos da classe Session. Agora eu consigo acessar corretamente. Eu tentei esse system.out e sempre vinha vazio.

Vou deixar tudo static até conseguir entender melhor o que pode estar acontecendo. Valeu Tiago!