Supongamos que tengo una página que enumera los objetos en una tabla y necesito poner un formulario para filtrar la tabla. El filtro se envía como Ajax GET a una URL como esa: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
Y en lugar de tener muchos parámetros en mi controlador como:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
Y suponiendo que tengo MyObject como:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Quiero hacer algo como:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
¿Es posible? ¿Cómo puedo hacer eso?
java
spring-mvc
renanleandrof
fuente
fuente
@ModelAttribute
, Ejemplo de manejo de formularios Spring MVC . Simplemente busque en Google " Spring MVC form handle " y obtendrá un montón de tutoriales / ejemplos. Pero asegúrese de utilizar una forma moderna de manejo de formularios, es decir, Spring v2.5 +@ModelAttribute
en Spring MVCRespuestas:
Puede hacerlo absolutamente, solo elimine la
@RequestParam
anotación, Spring vinculará limpiamente sus parámetros de solicitud a su instancia de clase:fuente
MyObject
entonces, de una manera similar que podemos hacer con @RequestParam?MyObject
para aceptar los parámetros de consulta en el caso de Snake y asignarlo a un miembro de caso de camelloMyObject
? Por ejemplo, ¿?book_id=4
debería mapearse con unbookId
miembro deMyObject
?Agregaré un pequeño ejemplo de mí.
La clase DTO:
Solicitar mapeo dentro de la clase de controlador:
Consulta:
Resultado:
Espero que ayude :)
ACTUALIZACIÓN / KOTLIN
Porque actualmente estoy trabajando mucho con Kotlin si alguien quiere definir un DTO similar, la clase en Kotlin debería tener la siguiente forma:
Con la
data
clase como esta:Spring (probado en el arranque) devuelve el siguiente error para la solicitud mencionada en la respuesta:
La clase de datos solo funcionará para el siguiente formulario de parámetros de solicitud:
¡Sé consciente de esto!
fuente
Tengo un problema muy similar. En realidad, el problema es más profundo como pensaba. Estoy usando jquery
$.post
que usaContent-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 hacerlo realidad.En mi caso, estoy tratando de enviar preferencias de usuario con algo como;
En el lado del cliente, los datos en bruto reales enviados al servidor son;
analizado como;
y el lado del servidor es;
Intenté
@ModelAttribute
, agregué setter / getters, constructores con todas las posibilidades,UserPreferences
pero sin posibilidad, ya que reconoció los datos enviados como 5 parámetros, pero de hecho, el método mapeado tiene solo 2 parámetros. También probé la solución de Biju, sin embargo, lo que sucede es que spring crea un objeto UserPreferences con el constructor predeterminado y no completa los datos.Resolví el problema enviando una cadena JSon de las preferencias desde el lado del cliente y manejarlo como si fuera una cadena en el lado del servidor;
cliente:
servidor:
para resumir, hice la conversión manualmente dentro del método REST. En mi opinión, la razón por la cual Spring no reconoce los datos enviados es el tipo de contenido.
fuente
@RequestMapping(method = POST, path = "/settings/{projectId}") public void settings(@PathVariable String projectId, @RequestBody ProjectSettings settings)
Dado que la pregunta sobre cómo configurar los campos obligatorios aparece debajo de cada publicación, escribí un pequeño ejemplo sobre cómo configurar los campos según sea necesario:
fuente
Mientras que las respuestas que se refieren a
@ModelAttribute
,@RequestParam
,@PathParam
y los gustos son válidos, hay un pequeño Gotcha me encontré. El parámetro del método resultante es un proxy que Spring envuelve su DTO. Por lo tanto, si intenta usarlo en un contexto que requiere su propio tipo personalizado, puede obtener algunos resultados inesperados.Lo siguiente no funcionará:
En mi caso, intentar usarlo en la unión de Jackson resultó en a
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
.Deberá crear un nuevo objeto desde el dto.
fuente
Sí, puedes hacerlo de una manera simple. Ver abajo el código de líneas.
URL: http: // localhost: 8080 / get / request / multiple / param / by / map? Name = 'abc' & id = '123'
fuente
La respuesta aceptada funciona a las mil maravillas, pero si el objeto tiene una lista de objetos, no funcionará como se esperaba, así que aquí está mi solución después de excavar.
Siguiendo este consejo de hilo , así es como lo he hecho.
No es lo mejor para depurar su API con cartero, pero funciona como se esperaba para mí.
Y aquí el SearchFilterDTO y el FilterDTO
fuente