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!