Lucas Cavalcanti:
o do pre-destroy é assim:
@Component
@SessionScoped
public class UserRolesInitialSetter {
private final UserRoles userRoles;
public UserRolesInitialSetter(UserRoles userRoles) {
this.userRoles = userRoles;
this.userRoles.add("NotAuthenticatedUser");
}
@PreDestroy
public void fazAlgo() {
// isso será executado ao fim da sessão do usuário
}
}
Entendi. Só que eu queria executar no início da Sessão.
Minha solução foi a seguinte:
Crio uma interface que deve ser implementada por quem quiser setar valores padrões
public interface EAccessCon4VraptorInitialDefaultValueProvider {
public List<String> getRoles();
public List<Method> getMethodDenials();
public List<Method> getMethodPermissions();
public List<Class<?>> getResourceDenials();
public List<Class<?>> getResourcePermissions();
}
Programador implementa minha interface
@Component
public class EAccessConDefaultValueProvider implements
EAccessCon4VraptorInitialDefaultValueProvider {
@Override
public List<String> getRoles() {
List<String> roles = new ArrayList<String>();
roles.add("NotAuthenticatedUser");
return roles;
}
@Override
public List<Method> getMethodDenials() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Method> getMethodPermissions() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Class<?>> getResourceDenials() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Class<?>> getResourcePermissions() {
// TODO Auto-generated method stub
return null;
}
Criar um customProvider e registrar a classe para minha interface
public class CustomProvider extends SpringProvider {
@Override
protected void registerCustomComponents(ComponentRegistry registry) {
registry.register(EAccessCon4VraptorInitialDefaultValueProvider.class,
EAccessConDefaultValueProvider.class);
}
}
Definir o CustomProvider no context-param
<context-param>
<param-name>br.com.caelum.vraptor.provider</param-name>
<param-value>(Caminho para o CustomProvider)</param-value>
</context-param>
Então uso a classe que define os valores padrões por meio da minha interface. Aí o código do programador que me permite pegar os valores padrões vai ser executado no início da sessão do usuário, já que eu vou fazer uma chamada direta para os métodos.
@Component
@SessionScoped
public class UserAccessDefinitions {
private List<Method> methodDenials;
private List<Method> methodPermissions;
private List<Class<?>> resourceDenials;
private List<Class<?>> resourcePermissions;
private List<String> roles;
private EAccessCon4VraptorInitialDefaultValueProvider defaultValuesProvider;
public UserAccessDefinitions(
EAccessCon4VraptorInitialDefaultValueProvider defaultValuesProvider) {
this.defaultValuesProvider = defaultValuesProvider;
}
@PostConstruct
public void addDefaultValues() {
//Inicio as variáveis aqui, usando o defaultValuesProvider. Seria melhor iniciar no construtor?
}
// setters e getters
}
Por enquanto essa é minha solução. Ficou um pouco complicado, hehehe.