Erro com login Struts2!

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:

login.jsp

[code]<s:form name=“fr_login” action=“login” method=“post”>

<s:actionerror />
<s:actionmessage />

	<s:textfield label="Login" name="username" /> /* aqui pega o valor inserido*/
	<s:password label="Password" name="password" /> /* aqui não!! e chega na classe java com null*/
	<s:submit />
	
</s:form>[/code]

UserAction

[code]
/**

  • Atributos acessados pela view
    */
    private String username;
    private String password;
    // 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)})
public String login () {
try {
if ( StringUtils.isBlank(username) ) {
addActionError(“Type a login!”);
}
if ( StringUtils.isBlank(password) ) {
addActionError(“Type a password!”);
}
if ( getActionErrors().size() > 0 ) {
return INPUT;
}
// resto do código e getters and setters dos atributos
[/code]

Lembrando que o username vem com valor da jsp, já o password vem com null…

Abrcs!

Olá, Rafael.

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:

[code]public setPassword(String password) {

}[/code]
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()”:

public void validate() { 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ê ;).

[quote=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ê ;).[/quote]

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:

[code]package net.Agile2Go.view.actions.user;

import net.Agile2Go.domain.entities.User;
import net.Agile2Go.domain.repositories.UserRepository;
import net.Agile2Go.infrastructure.util.security.DisableSecurityAction;
import net.Agile2Go.view.actions.BasicAction;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

import com.opensymphony.xwork2.ModelDriven;

@Namespace(value = “/”)
@ResultPath(value = “/”)
@ParentPackage(value = “default”)
public class UserAction extends BasicAction implements ModelDriven,
DisableSecurityAction {
/**
* Atributo de serialização, informa a versão da classe para o conteiner
*/
private static final long serialVersionUID = 8278524612322334361L;

/**
 * Atributo de log, grava mensagens e avisos durante a execução do sistema
 */
private Logger log = Logger.getLogger(getClass());

/**
 * Caminhos das páginas jsps
 */
private static final String PAGINA_LOGIN = "/login.jsp";
// private static final String PAGINA_ADM_HOME =
// "/WEB-INF/content/admin/home.jsp";
private static final String PAGINA_USER_HOME = "/jsp/home.jsp";

/**
 * Atributo que permite efetuar as operações referente a entidade usuário
 */
private UserRepository repository;

/**
 * Atributo que representa um usuário
 */
private User user;

/**
 * Login do usuário
 */
private String username;

/**
 * Senha do usuário
 */
private String password;

/**
 * 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 ? new User() : user;
}

@Action(value = "login", results = {
		@Result(name = SUCCESS, location = PAGINA_USER_HOME),
		@Result(name = INPUT, location = PAGINA_LOGIN),
		@Result(name = ERROR, location = PAGINA_LOGIN)})
public String login () {
	try {
		if ( StringUtils.isBlank(username) ) {
			addActionError("Type a login!");
		}
		if ( StringUtils.isBlank(password) ) {
			addActionError("Type a password!");
		}
		if ( getActionErrors().size() > 0 ) {
			return INPUT;
		}
		user.setLogin(username);
		user.setPassword(password);
		user = repository.userWithLogin(user.getLogin(), user.getPassword());
		if ( user == null ) {
			addActionError("User not found in the database!");
			return INPUT;
		}
		session.put("user", user);
		return SUCCESS;
	} catch (Exception e) {
		log.error(e.getLocalizedMessage(), e);
		addActionError("A expected error has ocurred!");
		session.clear();
		return ERROR;
	}
}

public final String getUsername() {
	return username;
}

public final void setUsername(String username) {
	this.username = username;
}

public final String getPassword() {
	return password;
}

public final void setPassword(String password) {
	this.password = password;
}

public void setRepository(UserRepository repository) {
	this.repository = repository;
}

public User getModel() {
	return user;
}

}
[/code]

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?

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…

[code]@Id
@SequenceGenerator(name = “USER_GENERATOR”, sequenceName = “resource_id_seq”, initialValue = 1, allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “USER_GENERATOR”)
private int id;

@Embedded
private Address address;

@Column(nullable = false)
private String name;

private String password;

@Enumerated(value = EnumType.STRING)
private UserRole role;

@Column(nullable = false, unique = true)
private String login;[/code]

Acho que matei a charada.
Como você usou o ModelDriven, aconteceu que:

  1. Como a classe User não tem username, o Struts2 setou o username da Action
  2. Como a classe User tem password, o Struts2 setou o password do objeto user

Faça um debug ai e confirme essa hipótese :wink:

Pode crê cara, eu tbm pensei nisso e pode ser mesmo, só não testo agora pq to no trampo, mas no almoço vejo já,

Obrigado Man!

Abrcs!