En el desarrollo de aplicaciones web con Spring MVC, utilizar Ajax para enviar datos a los controladores es una práctica común. Sin embargo, a veces los parámetros no se convierten automáticamente en objetos Java, lo que puede causar que los campos lleguen vacíos. A continuación, se dsecribe un enfoque para resolver este problema.
Primero, definimos una clase de entidad que represente los datos del formulario. En este caso, se ha renombrado para mayor claridad y se han ajustado los campos.
public class SolicitudVoz {
private String codigoVoz;
private Integer volumen;
private String velocidad;
private String textoEntrada;
private String tipoTexto;
// Métodos getter y setter con fluidez
public String getCodigoVoz() {
return codigoVoz;
}
public SolicitudVoz setCodigoVoz(String codigoVoz) {
this.codigoVoz = codigoVoz;
return this;
}
public Integer getVolumen() {
return volumen;
}
public SolicitudVoz setVolumen(Integer volumen) {
this.volumen = volumen;
return this;
}
public String getVelocidad() {
return velocidad;
}
public SolicitudVoz setVelocidad(String velocidad) {
this.velocidad = velocidad;
return this;
}
public String getTextoEntrada() {
return textoEntrada;
}
public SolicitudVoz setTextoEntrada(String textoEntrada) {
this.textoEntrada = textoEntrada;
return this;
}
public String getTipoTexto() {
return tipoTexto;
}
public SolicitudVoz setTipoTexto(String tipoTexto) {
this.tipoTexto = tipoTexto;
return this;
}
@Override
public String toString() {
return "SolicitudVoz{" +
"codigoVoz='" + codigoVoz + '\'' +
", volumen=" + volumen +
", velocidad='" + velocidad + '\'' +
", textoEntrada='" + textoEntrada + '\'' +
", tipoTexto='" + tipoTexto + '\'' +
'}';
}
}
En la capa del contrloador, configuramos la anotación @ResponseBody y especificamos el método POST con un produces para asegurar la respuesta en JSON. El controlador recibe la entidad como parámetro directo.
@ResponseBody
@RequestMapping(value = "/api/solicitud-voz",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8")
public String procesarSolicitudVoz(SolicitudVoz solicitudVoz) throws Exception {
try {
// Lógica de servicio aquí
System.out.println("Datos recibidos: " + solicitudVoz.toString());
return JSON.toJSONString(new Result()); // Ejemplo simplificado
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
En el cliente, mediante jQuery Ajax, enviamos los datos con el tipo de contenido application/x-www-form-urlencoded. Esto permite que Spring MVC extraiga los parámetros del formulario y los asigne a la entidad.
$.ajax({
type: 'POST',
url: '/api/solicitud-voz',
data: {
codigoVoz: codigoVozValor,
volumen: volumenValor,
velocidad: velocidadValor,
textoEntrada: textoEntradaValor,
tipoTexto: tipoTextoValor
},
contentType: 'application/x-www-form-urlencoded;charset=utf-8',
success: function(res) {
// Manejo de la respuesta
console.log('Respuesta exitosa:', res);
},
error: function(xhr) {
console.error('Error:', xhr.status);
}
});
Para evitar problemas de codificación de caracteres, es recomendable configurar un filtro en el arcchivo web.xml dentro del directorio WEB-INF.
<filter>
<filter-name>FiltroCodificacionCaracteres</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FiltroCodificacionCaracteres</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Al usar application/x-www-form-urlencoded en lugar de application/json, y sin convertir explícitamente a JSON en el cliente, Spring MVC puede mapear los campos del formulario a la entidad. La clave está en que el controlador procesa los datos del formulario, y la configuración produces indica el formato de respuesta.
Esta solución ha sido probada con dependencias de Spring en versión 4.3.x y funciona de manera efectiva para la conversión automática de parámetros.