Posteriormente a indagar en diferentes repositorios y foros de internet al final nos encontramos con la respuesta que te mostraremos pronto.
Solución:
Absolutamente puede hacer eso, simplemente elimine el @RequestParam
anotación, Spring vinculará limpiamente los parámetros de su solicitud a su instancia de clase:
public @ResponseBody List myAction(
@RequestParam(value = "page", required = false) int page,
MyObject myObject)
Agregaré un breve ejemplo mío.
La clase DTO:
public class SearchDTO
private Long id[];
public Long[] getId()
return id;
public void setId(Long[] id)
this.id = id;
// reflection toString from apache commons
@Override
public String toString()
return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
Solicitud de mapeo dentro de la clase de controlador:
@RequestMapping(value="/handle", method=RequestMethod.GET)
@ResponseBody
public String handleRequest(SearchDTO search)
LOG.info("criteria: ", search);
return "OK";
Consulta:
http://localhost:8080/app/handle?id=353,234
Resultado:
[http-apr-8080-exec-7] INFO c.g.g.r.f.w.ExampleController.handleRequest:59 - criteria: SearchDTO[id=353,234]
Espero que ayude 🙂
ACTUALIZAR / KOTLIN
Debido a que actualmente estoy trabajando mucho con Kotlin, si alguien quiere definir un DTO similar, la clase en Kotlin debería tener la siguiente forma:
class SearchDTO
var id: Array? = arrayOf()
override fun toString(): String
// to string implementation
Con el data
clase como esta:
data class SearchDTO(var id: Array = arrayOf())
Spring (probado en Boot) devuelve el siguiente error para la solicitud mencionada en la respuesta:
“Error al convertir el valor del tipo ‘java.lang.String[]’ al tipo requerido ‘java.lang.Long[]’; la excepción anidada es java.lang.NumberFormatException: para entrada string: “353,234””
La clase de datos funcionará solo para el siguiente formulario de parámetros de solicitud:
http://localhost:8080/handle?id=353&id=234
¡Sé consciente de esto!
Tengo un problema muy similar. En realidad, el problema es más profundo como pensaba. estoy usando jquery $.post
que utiliza Content-Type:application/x-www-form-urlencoded; charset=UTF-8
por defecto. Desafortunadamente, basé mi sistema en eso y cuando necesitaba un objeto complejo como @RequestParam
No podía simplemente hacer que sucediera.
En mi caso, estoy tratando de enviar preferencias de usuario con algo como;
$.post("/updatePreferences",
id: 'pr', preferences: p,
function (response) {
...
En el lado del cliente, los datos sin procesar reales enviados al servidor son;
...
id=pr&preferences%5BuserId%5D=1005012365&preferences%5Baudio%5D=false&preferences%5Btooltip%5D=true&preferences%5Blanguage%5D=en
...
analizado como;
id:pr
preferences[userId]:1005012365
preferences:false
preferences[tooltip]:true
preferences[language]:en
y el lado del servidor es;
@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") UserPreferences preferences)
...
return someService.call(preferences);
...
Lo intenté @ModelAttribute
agregado setter/getters, constructores con todas las posibilidades para UserPreferences
pero no hay posibilidad ya que reconoció los datos enviados como 5 parámetros pero, de hecho, el método asignado solo tiene 2 parámetros. También probé la solución de Biju, sin embargo, lo que sucede es que Spring crea un objeto UserPreferences con un constructor predeterminado y no completa los datos.
Resolví el problema enviando JSon string de las preferencias del lado del cliente y manejarlo como si fuera una cadena en el lado del servidor;
cliente:
$.post("/updatePreferences",
id: 'pr', preferences: JSON.stringify(p),
function (response) {
...
servidor:
@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") String preferencesJSon)
String ret = null;
ObjectMapper mapper = new ObjectMapper();
try
UserPreferences userPreferences = mapper.readValue(preferencesJSon, UserPreferences.class);
return someService.call(userPreferences);
catch (IOException e)
e.printStackTrace();
para resumir, hice la conversión manualmente dentro del método REST. En mi opinión, la razón por la que Spring no reconoce los datos enviados es el tipo de contenido.
Aquí tienes las comentarios y puntuaciones
Puedes añadir valor a nuestro contenido informacional contribuyendo tu experiencia en las interpretaciones.