Binding de collections Struts 2

3 respostas
alessandrasch

Olá Pessoal!!!

Estou com uma dúvida referente ao binding do Struts 2.
Tenho uma action que tem um objeto Usuario, sendo que este tem uma collection de objetos do tipo Centro. Na página jsp, tenho um checkbox list que receberá os centros.
O fato é que o Struts não está fazendo o bind automático dessa collection. Deveria fazer?
Existe a possibilidade de criar um typeConverter, mas seria muito repetitivo, pois vou usar em outros casos também.

3 Respostas

T

realmente não deu para entender, mas se tu quer um conversor de tipos dê uma olhada nos converters do struts2

alessandrasch

Esta é minha action, que irá processar os dados da página jsp.

@Validation
@Results( { @Result(name = "success", value = "/paginas/jsp/usuario.jsp"),
    @Result(name = "input", value = "/paginas/jsp/usuario.jsp"),
    @Result(name = "listAll", value = "/paginas/jsp/listaUsuarios.jsp") })
public class UsuarioAction extends ActionSupport {

  private Usuario usuario = new Usuario();
  private CentroDAO centroDAO = Factory.criaCentroDAO();
  private UsuarioDAO usuarioDAO = Factory.criaUsuarioDAO();

  public List<Centro> getListaCentros() throws Exception {
    HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
    List<Centro> centros = centroDAO.centrosPorSituacao("A");
    HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
    return centros;
  }

  public String inserir() throws Exception {
    HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
    if (usuario.getId() > 0) {
      try {
        usuarioDAO.update(usuario);
        addActionMessage("Usuário alterado com sucesso");
        usuario = new Usuario();
      }
      catch (Exception e) {
        e.printStackTrace();
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
        addActionError("Erro atualizando usuário. Causa: " + e.getCause());
      }
    }
    else {
      try {
        usuarioDAO.insert(usuario);
        addActionMessage("Usuário inserido com sucesso");
        usuario = new Usuario();
      }
      catch (ConstraintViolationException ex) {
        addActionError(" existe um usuário com o id " + usuario.getCodUsu());
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
      }
      catch (Exception e) {
        e.printStackTrace();
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
        addActionError("Erro inserindo usuário. Causa: " + e.getCause());
      }
    }
    HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
    // preenche();
    return INPUT;
  }

}
Este é o form da minha página jsp:
<s:form name="frmUsuario" action="usuario!inserir" validate="true" namespace="/" method="POST">
		<s:textfield name="usuario.id" readonly="true" label="Id" />
		<s:textfield name="usuario.codUsu" label="Login" size="30" theme="ajax" />
		<s:textfield name="usuario.senUsu" label="Senha" size="30" />
		<s:textfield name="usuario.przLan" label="Prazo de lançamento" size="10" />
		<s:textfield name="usuario.eMail" label="E-mail" size="50" />
		<s:checkboxlist list="%{listaCentros}" label="Centros Permitidos" name="usuario.centrosPermitidos"
			listKey="id" listValue="nomCcu"></s:checkboxlist>
		<s:submit value="Gravar" notifyTopics="listaUsuariosTopic" align="center" />
	</s:form>
Este é minha classe de usuário:
public class Usuario implements Serializable {
  @Id
  @GeneratedValue
  private int id;
  @Column(unique = true, length = 15)
  private String codUsu;
  @Column(length = 10)
  private String senUsu;
  @Enumerated(EnumType.STRING)
  @Column(length = 15)
  private TipoUsuario tipUsu;
  private int przLan;
  @ManyToOne
  @JoinColumn(name = "id_col")
  private Colaborador colaborador = new Colaborador();
  @ManyToMany(fetch = FetchType.LAZY)
  private Set<Centro> centrosPermitidos = new HashSet<Centro>();
  @ManyToOne
  @JoinColumn(name = "id_ger", referencedColumnName = "id")
  private Usuario gerente;

  private String eMail;

  @OneToMany(mappedBy = "usuario", fetch = FetchType.LAZY)
  private Set<Acesso> acessos = new HashSet<Acesso>();
  static Logger logger = Logger.getLogger(Usuario.class);

  public Set<Acesso> getAcessos() {
    return acessos;
  }

  public void setAcessos(Set<Acesso> acessos) {
    this.acessos = acessos;
  }

  @RequiredFieldValidator(message = "Login é um campo obrigatório")
  public String getCodUsu() {
    return codUsu;
  }

  public void setCodUsu(String codUsu) {
    this.codUsu = codUsu;
  }

  @RequiredFieldValidator(message = "Senha é um campo obrigatório")
  @StringLengthFieldValidator(minLength = "5", maxLength = "10", message = "Senha deve conter no mínimo ${minLength} e no máximo ${maxLength} caracteres ")
  public String getSenUsu() {
    return senUsu;
  }

  public void setSenUsu(String senUsu) {
    this.senUsu = senUsu;
  }

  // @RequiredFieldValidator(type=ValidatorType.FIELD, message = "Tipo de
  // usuário é um campo obrigatório.")
  public TipoUsuario getTipUsu() {
    return tipUsu;
  }

  //@TypeConversion(converter = "util.EnumTypeConverter")
  public void setTipUsu(TipoUsuario tipUsu) {
    logger.info("Setando tipo de usuário: " + tipUsu);
    this.tipUsu = tipUsu;
  }

  @RequiredFieldValidator(message = "Prazo de lançamento é um campo obrigatório.")
  public int getPrzLan() {
    return przLan;
  }

  public void setPrzLan(int przLan) {
    this.przLan = przLan;
  }

  @RequiredFieldValidator(message = "Gerente é um campo obrigatório.")
  public Usuario getGerente() {
    return gerente;
  }

  public void setGerente(Usuario gerente) {
    this.gerente = gerente;
  }

  @RequiredFieldValidator(message = "E-mail é um campo obrigatório.")
  @EmailValidator(message = "Digite um e-mail válido.")
  public String getEMail() {
    return eMail;
  }

  public void setEMail(String mail) {
    eMail = mail;
  }

  public Usuario() {

  }

  @Override
  public String toString() {
    // TODO Auto-generated method stub
    return "Usuário :" + this.codUsu + " / Nome: " + this.colaborador.getNomFun();
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public Colaborador getColaborador() {
    return colaborador;
  }

  public void setColaborador(Colaborador colaborador) {
    this.colaborador = colaborador;
  }

  public Set<Centro> getCentrosPermitidos() {
    return centrosPermitidos;
  }
  
  public void setCentrosPermitidos(Set<Centro> centrosPermitidos) {
    this.centrosPermitidos = centrosPermitidos;
  }

}

Eu gostaria de saber se estou "viajando", achando que o struts deveria pegar do checklistbox, o id de cada box selecionado e recuperar o objeto Centro com este id e colocar dentro da collection automaticamente...

Obrigada!!!

I

Não deu pra entender muito bem não !!!

POsta o exemplo aí pra nós do forum que fica muito melhor .

falow :slight_smile:

Criado 24 de janeiro de 2008
Ultima resposta 24 de jan. de 2008
Respostas 3
Participantes 3