Saltar al contenido

Spring MVC: objeto complejo como GET @RequestParam

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é @ModelAttributeagregado 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *