[RESOLVIDO] Struts 2 + Validação

Boa noite pessoal,

Gostaria de pedir ajuda com o processo de validação do struts2. Tenho o seguinte código:



@Namespace("/permissoes")
public class GrupoAct extends ActionSupport implements SessionAware {

	private Usuario usaurio;
	private List<Regras> regras;
	private Map<String, Object> session;
	private Grupo grupo = new Grupo();
	private List<Grupo> colGrupos;
	private String regrasTexto = "";

	@SkipValidation
	@Action(value = "FrmGrupos", results = { @Result(name = "ok", location = "/WEB-INF/jsp/telas/FrmGrupos.jsp") })
	public String editaPermissoes() {
		ApplicationContext apx = WebApplicationContextUtils
				.getWebApplicationContext(ServletActionContext
						.getServletContext());
		GrupoDAO grupoDao = (GrupoDAO) apx.getBean("GrupoDAO");

		Usuario usuario = (Usuario) session.get(Sessao.usuarioLogado);

		regras = Arrays.asList(Regras.values());

		colGrupos = grupoDao.getColByDono(usuario, usuario);

		return "ok";
	}

	@SkipValidation
	@Action(value = "NovoGrupo", results = { @Result(name = "novo", location = "/WEB-INF/jsp/telas/FrmGruposEditar.jsp") })
	public String novoGrupo() {
		grupo = new Grupo();
		regras = Arrays.asList(Regras.values());
		return "novo";
	}

	@SkipValidation
	@Action(value = "EditaGrupo", results = { @Result(name = "editar", location = "/WEB-INF/jsp/telas/FrmGruposEditar.jsp") })
	public String editaGrupo() {
		grupo = (Grupo) session.get(Sessao.grupo);

		regras = Arrays.asList(Regras.values());
		return "editar";
	}

	@Action(value = "SalvarGrupo", results = {
			@Result(name = "ok", type = "redirectAction", params = {
					"actionName", "FrmGrupos" }),
			@Result(name = "input", type = "redirectAction", params = {
					"actionName", "EditaGrupo" }) })
	public String salvarGrupo() throws Exception {
		ApplicationContext apx = WebApplicationContextUtils
				.getWebApplicationContext(ServletActionContext
						.getServletContext());
		ServiceDao<Grupo> service = (GrupoDAO) apx.getBean("GrupoDAO");

		grupo.setUsuarioDono((Usuario) session.get(Sessao.usuarioLogado));
		grupo.setRegras(getRegras(regrasTexto));
		if (grupo.getRegras() == null) {
			System.out.println("ERRROROOO com grupos nulos");
		} else if (service.salvar(grupo,
				(Usuario) session.get(Sessao.usuarioLogado))) {
			session.put(Sessao.grupoRegras, null);
			return "ok";
		} else {
			System.out.println("ERRROROOO");
		}
		return null;

	}

	public List<Regras> getRegras(String regras) {
		List<Regras> col = new ArrayList<Regras>();
		for (String r : regras.split("x")) {
			col.add(Regras.getRegras(Integer.valueOf(r)));
		}
		return col;
	}

	public List<Regras> getRegras() {
		return regras;
	}

	public void setRegras(List<Regras> regras) {
		this.regras = regras;
	}

	public Usuario getUsaurio() {
		return usaurio;
	}

	public void setUsaurio(Usuario usaurio) {
		this.usaurio = usaurio;
	}

	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	public Grupo getGrupo() {
		return grupo;
	}

	@VisitorFieldValidator(key = "grupo")
	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public List<Grupo> getColGrupos() {
		return colGrupos;
	}

	public void setColGrupos(List<Grupo> colGrupos) {
		this.colGrupos = colGrupos;
	}

	public String getRegrasTexto() {
		return regrasTexto;
	}

	public void setRegrasTexto(String regrasTexto) {
		this.regrasTexto = regrasTexto;
	}

	public void validate() {

		if (getRegrasTexto().isEmpty()) {
			super.addFieldError("regrasTexto",
					"Tem de ser escolhido pelo menos um nível de permissão");
		}
		if (((getRegrasTexto().contains(""
				+ Regras.ADMINISTRADOR_AUTONOMO.getCodigo())))
				&& (getRegrasTexto().contains("x"))) {
			super.addFieldError(
					"regrasTexto",
					"Quando for escolhido o administrador autonômo, não pode ser escolhido nem um outro!!!");
		}

		session.put(Sessao.grupo, grupo);
	}
}

Eu preciso realizar umas validações nele. O código realiza a validação certinho, o problema é que quando ele dá o retorno (a página que é enviada com o result “input” na action “SalvarGrupo”) ele não mantém o objeto “grupo”. Em outras palavras eu estou enviando um objeto “Grupo” para o struts validar, quando ele realiza a validação e o objeto não passa, ele encaminha novamente para a página de correção só que nenhum campo é preenchido, o usuário tem de preencher todos os campos novamente e é isto que eu estou querendo evitar.

A minha jsp é recebida via ajax (jquery), não sei se isso interfere e é esta aki:

<%@page import="jubernate.constantes.Sessao"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!-- Importação dos css -->
<c:import url="/WEB-INF/jsp/divs/cabecalhos.jsp" />

<div>
	<!-- 	barra de navegação -->
	<div id="navegacao" class="navegacao fonte-100">
		<a href="MenuPrincipal"><fmt:message key="principal.navegacao" />
		</a> -> <a href="gerGrupos"><fmt:message
				key="frmgrupos.consulta_grupo" /></a> ->
		<fmt:message key="frmgrupo_editar.barra_navegacao" />
	</div>
	<!-- 	título -->
	<div>
		<h1>
			<fmt:message key="frmgrupo_editar.titulo" />
		</h1>
	</div>
	<div>
		<form id="grupoSalvar" method="POST" action="SalvarGrupo" >
<!-- 		 -->
			<fieldset>
				<legend class="fonte-120">
					<b><fmt:message key="frmgrupo_editar.titulo_formulario" /></b>
				</legend>

				<input type="hidden" name="grupo.codigo" id="grupo.codigo" value="${grupo.codigo}"/>
				<label for="grupo.nome" class="fonte-100"><fmt:message
						key="frmgrupo_editar.nome" /> </label> <input type="text" id="grupo.nome"
					name="grupo.nome" /><br /> <label for="grupo.observacoes"
					class="fonte-100"><fmt:message
						key="frmgrupo_editar.observacoes" /></label><br />
				<textarea rows="5" cols="50" id="grupo.observacoes"
					name="grupo.observacoes" ></textarea>
				</br>
				<!-- 			<div style="position:relative;"> -->
				<label for="regras" class="fonte-100"><fmt:message
						key="frmgrupo_editar.permissoes" /></label> <select id="cbRegras"
					class="fonte-80">
					<c:forEach items="${regras}" var="reg">
						<option value="${reg.codigo}">${reg.nome }</option>
					</c:forEach>
				</select>
				<!-- 			</div> -->
				<button name="bAddPermissao" id="bAddPermissao"
					onclick="addPermissao()" class="fonte-80" type="button">+</button>
				<button name="bRemovePermissao" id="bRemovePermissao"
					onclick="removePermissao()" class="fonte-80" type="button">-</button>
				<br />
				<table id="tbGrupoPermissoes">
					<thead>
						<tr>
							<td><fmt:message key="frmgrupo_editar.tbl_permissao_grupo" /></td>
						</tr>
					</thead>
					<c:forEach items="${grupo.regras}" var="reg" varStatus="status">
						<tr id="grupo.regras[${status.index} }]">
							<td>${status.index} - ${reg.nome}</td>
						</tr>
					</c:forEach>
				</table>
			<input type="hidden" name="regrasTexto" id="regrasTexto" value=""/>
			</fieldset>
			<div id = "jaTemPermissao"  title=<fmt:message key="frmgrupo_mensagem.permissao_ja_existe_titulo" /> >
				<p><fmt:message key="frmgrupo_mensagem.permissao_ja_existe" /></p>
			</div>
			<div id = "relPermVazia"  title=<fmt:message key="frmgrupo_mensagem.permissao_rel_vazia_titulo" /> >
				<p><fmt:message key="frmgrupo_mensagem.permissao_rel_vazia" /></p>
			</div>
			
			
			<div id="frmGrupos_botoes">
				<button id="bSalvarGrupo" type="submit">
					<fmt:message key="frmgrupo_editar.salvar" />
				</button>
				
				<button id="bCancelarGrupo" type="button"
					onclick="redirecionaGrupos()">
					<fmt:message key="frmgrupo_editar.cancelar" />
				</button>
			</div>

		</form>
		<!-- 	JS - JavaScript -->

		<script type="text/javascript"
			src="${pageContext.request.contextPath}/js/jscript.js"></script>
	</div>


</div>

Agradeço a todos que puderem dar uma olhada.

Vlw

Não sei se isso pode ter haver, mas a jsp que eu estou tentando carregar por ajax, não possui nenhum campo preenchido pelo struts, até o combo (select) não está sendo preenchido.

Ei gente descobri que o struts não está preenchendo os campos, mesmo sem a validação. Por acaso alguém sabe se o struts consegue gerenciar na mesma classe action mais de um objeto?

Como estão as configurações?

Boa tarde pessoal, principalmente drsmachado,

Primeiro obrigado por dar uma olhada no tópico e oferecer ajuda. Segundo eu descobri o problema, o erro é tão básico que dá até vergonha. Tipo… A minha jsp tá muito boa e bonita, recebendo os dados, mandando para o struts… coisa linda… Eu só esqueci de usar a jslt para imprimir os dados nela. Detalhezinho sem “importância” :lol:

Inté…

Relaxa camarada, a nossa vida é tão atarefada e corrida que sempre buscamos o improvável, mutas vezes, deixando o óbvio de lado.
Vergonha nenhuma reconhecer que errou, pior seria manter-se no erro.

Abraço.