Pessoal, eu não sei se estou ficando louco ou não estou enchergando o porque do meu atributo password vem null da tela de login, e o atributo username vem com o valor que eu inseri, que é 'adm', segue código resumido:
/***Atributosacessadospelaview*/privateStringusername;privateStringpassword;// outros atributos@Action(value="login",results={@Result(name=SUCCESS,location=PAGINA_USER_HOME),@Result(name=INPUT,location=PAGINA_LOGIN),@Result(name=ERROR,location=PAGINA_LOGIN)})publicStringlogin(){try{if(StringUtils.isBlank(username)){addActionError("Type a login!");}if(StringUtils.isBlank(password)){addActionError("Type a password!");}if(getActionErrors().size()>0){returnINPUT;}// resto do código e getters and setters dos atributos
Lembrando que o username vem com valor da jsp, já o password vem com null...
Amigo, você diz que há "getters e setters" para o login e senha.
Verifique como está a assinatura do setter do "password".
A assinatura deve estar EXATAMENTE assim:
publicsetPassword(Stringpassword){
}
Se o nome do parâmetro estiver diferente de "password" não funcionará, não sei porque ^^'
E, uma dica: Acho que fez algo que era desnecessário com o Struts 2.
Se eu fosse você, criaria o método "validate()":
publicvoidvalidate(){
if(StringUtils.isBlank(username)){addActionError("Type a login!"); }if(StringUtils.isBlank(password)){addActionError("Type a password!"); }
}
Dai, no seu "login()" você bota só o código do caso de uso em si. O próprio framework vai ver se foi acrescentado um "actionError" ou "fieldError" e manda o retorno pra "input" ou não pra você ;).
rafael_jesus
jyoshiriro:
E, uma dica: Acho que fez algo que era desnecessário com o Struts 2.
Se eu fosse você, criaria o método "validate()":
Dai, no seu "login()" você bota só o código do caso de uso em si. O próprio framework vai ver se foi acrescentado um "actionError" ou "fieldError" e manda o retorno pra "input" ou não pra você ;).
Cara o que eu ia fazer era criar uma classe de UserBO que fizesse todas as validações necessárias da entidade User e mais alguma coisininha, posso fazer da sua maneira tbm...
Os setters and getters estão EXTRAMAMENTE iguais, foram gerados automaticamente
Vou postar meu código todo aqui para que veja com seus próprios olhos:
packagenet.Agile2Go.view.actions.user;importnet.Agile2Go.domain.entities.User;importnet.Agile2Go.domain.repositories.UserRepository;importnet.Agile2Go.infrastructure.util.security.DisableSecurityAction;importnet.Agile2Go.view.actions.BasicAction;importorg.apache.commons.lang.StringUtils;importorg.apache.log4j.Logger;importorg.apache.struts2.convention.annotation.Action;importorg.apache.struts2.convention.annotation.Namespace;importorg.apache.struts2.convention.annotation.ParentPackage;importorg.apache.struts2.convention.annotation.Result;importorg.apache.struts2.convention.annotation.ResultPath;importcom.opensymphony.xwork2.ModelDriven;@Namespace(value="/")@ResultPath(value="/")@ParentPackage(value="default")publicclassUserActionextendsBasicActionimplementsModelDriven<User>,DisableSecurityAction{/** * Atributo de serialização, informa a versão da classe para o conteiner */privatestaticfinallongserialVersionUID=8278524612322334361L;/** * Atributo de log, grava mensagens e avisos durante a execução do sistema */privateLoggerlog=Logger.getLogger(getClass());/** * Caminhos das páginas jsps */privatestaticfinalStringPAGINA_LOGIN="/login.jsp";// private static final String PAGINA_ADM_HOME =// "/WEB-INF/content/admin/home.jsp";privatestaticfinalStringPAGINA_USER_HOME="/jsp/home.jsp";/** * Atributo que permite efetuar as operações referente a entidade usuário */privateUserRepositoryrepository;/** * Atributo que representa um usuário */privateUseruser;/** * Login do usuário */privateStringusername;/** * Senha do usuário */privateStringpassword;/** * Este bloco de código será executado no construtor logo após a chamada de * super(), para que o user não start com null. */{user=user==null?newUser():user;}@Action(value="login",results={@Result(name=SUCCESS,location=PAGINA_USER_HOME),@Result(name=INPUT,location=PAGINA_LOGIN),@Result(name=ERROR,location=PAGINA_LOGIN)})publicStringlogin(){try{if(StringUtils.isBlank(username)){addActionError("Type a login!");}if(StringUtils.isBlank(password)){addActionError("Type a password!");}if(getActionErrors().size()>0){returnINPUT;}user.setLogin(username);user.setPassword(password);user=repository.userWithLogin(user.getLogin(),user.getPassword());if(user==null){addActionError("User not found in the database!");returnINPUT;}session.put("user",user);returnSUCCESS;}catch(Exceptione){log.error(e.getLocalizedMessage(),e);addActionError("A expected error has ocurred!");session.clear();returnERROR;}}publicfinalStringgetUsername(){returnusername;}publicfinalvoidsetUsername(Stringusername){this.username=username;}publicfinalStringgetPassword(){returnpassword;}publicfinalvoidsetPassword(Stringpassword){this.password=password;}publicvoidsetRepository(UserRepositoryrepository){this.repository=repository;}publicUsergetModel(){returnuser;}}
jyoshiriro
Olá,
amigo, pelo que vi está implementando o ModelDriven para uma classe “User”.
Se não me engano, quando se faz isso, os campos do formulário procuram por atributos de “User”.
Sua classe User tem quais atributos?
rafael_jesus
Entendi, mas estranho ele pegar só um atributo na jsp, os dois atributos que eu tenho na action são String e não pertencem a entidade User, o que eu faço depois de validar é setar os atributos passando por parametros as strings já validadas...
Eu faço assim na empresa com outros projetos e funfa de boa ....mas esse ai ta osso..