Announcement Announcement Module
Collapse
No announcement yet.
Problem submit hidden value to controller Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem submit hidden value to controller

    In first instance, sorry for my English.

    I have a Controller that return a form page to create a new object. In the form page, all works fine, but when I do submit,
    in the controller I have a null value in "indicador.subgrupo".

    indicador is an object of type Indicador, and subgrupo is an object of type Subgrupo.

    The code of the form is (the problem is in the hidden tags):

    Code:
    <form:form method="POST" modelAttribute="indicador">
    	<form:hidden path="id" />
    	<form:hidden path="usuario" />
    	<form:hidden path="subgrupo.id" />
    	<form:hidden path="subgrupo.grupo.id" />
    	
       	<fieldset>
       	<legend><c:out value="${titulo}" /></legend>
    	<table cellspacing="0">
    		<tr>
    			<td><label for="nombre">Nombre:</label></td>
    			<td colspan="3"><form:input path="nombre" size="30" maxlength="30" /><br/>
    			<form:errors path="nombre" cssClass="error"/></td>
    			<td colspan="3"><label for="subgrupo">Subgrupo:</label><c:out value="${indicador.subgrupo.nombre}" /></td>
    		</tr>
    		<tr>
    			<td><label for="descripcion">Descripción:</label></td>
    			<td colspan="6"><form:input path="descripcion" size="50" maxlength="200"/><br/>
    			<form:errors path="descripcion" cssClass="error"/></td>
    		</tr>
    		<tr>
    			<td><label for="frecuencia">Frecuencia:</label></td>
    			<td><form:select path="frecuencia"  items="${frecuencias}" itemValue="id" itemLabel="nombre"/></td>
    			<td><label for="tipo">Tipo:</label></td>
    			<td><form:select path="tipo"  items="${tipos}" itemValue="id" itemLabel="nombre"/></td>
    			<td><label for="unidad">Unidad:</label></td>
    			<td colspan="2"><form:select path="unidad"  items="${unidades}" itemValue="id" itemLabel="nombre"/></td>
    		</tr>
    		<tr>
    			<td colspan="4"><label for="tiposGerencia">Gerencias a las que se aplica el indicador:</label><br/>
    		    <form:select path="tiposGerencia" items="${tiposGerencia}" itemValue="id" itemLabel="descripcion" multiple="true" /></td>
    		    <td colspan="3"><form:checkbox path="esCentro" label='Recogida de datos por centro'/></td>
    		</tr>
    		<tr>
    			<td colspan="4"><label for="orden">¿Dónde hay que colocar el nuevo indicador?</label></td>
    			<td colspan="3"><form:select path="orden"  items="${posiciones}" itemValue="id" itemLabel="descripcion"/>
    			<br/><form:errors path="orden" cssClass="error"/></td>
    		</tr>
    	</table>
    	</fieldset>
    	<input type="submit" value="Guardar" class="boton" />
    </form:form>
    In the Chrome Navigator, I see the source code and I can see that indicador.subgrupo.id has the correct value:

    Code:
    <form id="indicador" action="/cdmg/indicadores/6/27?new" method="POST">
    <input id="id" name="id" type="hidden" value="0"/>
    <input id="usuario" name="usuario" type="hidden" value="Prueba"/>
    <input id="subgrupo.id" name="subgrupo.id" type="hidden" value="27"/>
    <input id="subgrupo.grupo.id" name="subgrupo.grupo.id" type="hidden" value="6"/>
    <fieldset>
    ...
    </fieldset>
    <input class="boton" value="Guardar" type="submit"/>
    </form>
    Finally, in the controller, the attribute indicador.subgrupo is null.

    The Indicador code is:

    Code:
    public class Indicador {
    	
    	@NotNull
    	@Min (value=0)
    	private int id;
    	@NotNull (message="El nombre es obligatorio")
    	@Size(min=1, max=30, message="El tamaño máximo del nombre es de 30 caracteres")
    	private String nombre;
    	@Size(min=0, max=200, message="El tamaño máximo de la descripción es de 200 caracteres")
    	private String descripcion;
    	@NotNull
    	private Subgrupo subgrupo;
    	@Min (value=1)
    	private int tipo;
    	@Min (value=1)
    	private int unidad;
    	@Min (value=1)
    	private int frecuencia;	
    	@NotNull (message="Debe indicarse la posición del indicador en el subgrupo")
    	@Min (value=1)
    	private int orden;
    	@NotNull (message="El indicador debe corresponder al menos con un tipo de gerencia")
    	private List<Integer> tiposGerencia;
    	@NotNull
    	private boolean esCentro;
    	@NotNull
    	@Size(min=1, max=30)
    	private String usuario;
    	
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getNombre() {
    		return nombre;
    	}
    	public void setNombre(String nombre) {
    		this.nombre = nombre;
    	}
    	public String getDescripcion() {
    		return descripcion;
    	}
    	public void setDescripcion(String descripcion) {
    		this.descripcion = descripcion;
    	}
    	public Subgrupo getSubgrupo() {
    		return subgrupo;
    	}
    	public void setSubgrupo(Subgrupo subgrupo) {
    		this.subgrupo = subgrupo;
    	}
    	public int getTipo() {
    		return tipo;
    	}
    	public void setTipo(int tipo) {
    		this.tipo = tipo;
    	}
    	public int getUnidad() {
    		return unidad;
    	}
    	public void setUnidad(int unidad) {
    		this.unidad = unidad;
    	}
    	public int getFrecuencia() {
    		return frecuencia;
    	}
    	public void setFrecuencia(int frecuencia) {
    		this.frecuencia = frecuencia;
    	}
    	public int getOrden() {
    		return orden;
    	}
    	public void setOrden(int orden) {
    		this.orden = orden;
    	}
    	public void setTiposGerencia(List<Integer> tiposGerencia) {
    		this.tiposGerencia = tiposGerencia;
    	}
    	public List<Integer> getTiposGerencia() {
    		return tiposGerencia;
    	}
    	public boolean isEsCentro() {
    		return esCentro;
    	}
    	public void setEsCentro(boolean esCentro) {
    		this.esCentro = esCentro;
    	}
    	public String getUsuario() {
    		return usuario;
    	}
    	public void setUsuario(String usuario) {
    		this.usuario = usuario;
    	}
    	
    	public String toString(){
    		StringBuffer cadena = new StringBuffer("");
    		cadena.append("\tId indicador: " + id + "\n");
    		cadena.append("\tId subgrupo: " + subgrupo.getId() + "\n");
    		cadena.append("\tNombre: " + nombre + "\n");
    		cadena.append("\tDescripcion: " + descripcion + "\n");
    		cadena.append("\tOrden: " + orden + "\n");
    		cadena.append("\tNivel de centro: " + esCentro + "\n");
    		cadena.append("\tTipo: " + tipo + "\n");
    		cadena.append("\tFrecuencia: " + frecuencia + "\n");
    		cadena.append("\tUnidad: " + unidad + "\n");
    		cadena.append("\tUsuario: " + usuario + "\n");
    		return cadena.toString();
    	}
    }
    Please, Any idea about what is the error?

  • #2
    You might want to consider the way you are validating your object graph.

    JSR 303 provides support for Object Graph Validation where validation will be applied recursively on all associated objects.

    So in your case, you might do something like this:

    Code:
    public class Indicador {
    	
    	@NotNull
    	@Min (value=0)
    	private int id;
    	
            @NotNull (message="El nombre es obligatorio")
    	@Size(min=1, max=30, message="El tamaño máximo del nombre es de 30 caracteres")
    	private String nombre;
    	
           @Size(min=0, max=200, message="El tamaño máximo de la descripción es de 200 caracteres")
    	private String descripcion;
    	
           @Valid
    	private Subgrupo subgrupo;
           
           ...........
    }
    
    public class Subgrupo {
            @NotNull
    	@Min (value=0)
    	private int id;
         
            -----------
    }
    Otherwise, Subgrupo is null because you never pre-initialize it.

    Comment

    Working...
    X