2011-10-24 17 views
7

tengo la siguiente petición GET:Spring 3 MVC - parámetros de la petición mapa con el prefijo a un solo grano de

/api/search?filter.operation=Ping&filter.namespace=

Tenga en cuenta los nombres de los parámetros incluyen un prefijo (operación filtro, filtro.. namespace).

Entonces, tengo el siguiente frijol quiero usar para recibir esos parámetros:

class MessageSearchFilter { 
    String operation; 
    String namespace; 
    ... 
} 

y el método manejador tiene la siguiente firma:

public @ResponseBody String searchMessages(MessageSearchFilter filter, ...);

Sin embargo, esto no lo hace Trabajar como Spring MVC espera que los atributos 'operación' y 'espacio de nombres' se nombren exactamente así. Funciona si cambio mi solicitud para usar 'operation' y 'namespace' (sin el prefijo 'filter.').

¿Hay alguna manera en que pueda decirle a Spring que espere que los parámetros tengan el prefijo 'filtro'?

Una pregunta adicional relacionada con esto es, ¿qué sucede si tengo una firma de método con varios objetos de formulario con nombres de propiedades que colisionan?

Respuesta

0

Usted debe ser capaz de asignar los parámetros de cadena de consulta entrantes usando @RequestParam, y se puede calificar totalmente ellas:

//Your @RequestMapping here... 
public @ResponseBody String searchMessages(
    @Requestparam("filter.operation") String filterOperation, 
    @RequestParam("filter.namespace") String filterNamespace) { 
    MessageSearchFilter messageSearchFilter = new MessageSearchFilter(); 
    messageSearchFilter.operation = filterOperation; 
    messageSearchFilter.namespace = filterNamespace; 
    //do your thing here... 
} 

También se dará cuenta de que usted debería ser capaz de añadir ahora calificadores para otros objetos con conflictos de nombres de propiedad .

+1

Gracias, sin embargo, estaba buscando una forma de evitar crear y establecer valores de bean manualmente. Esperaría que esto funcionara de alguna manera porque Spring hace esto correctamente para beans anidados. – jjmontes

+0

También estoy interesado si hay una forma de primavera para inyectar directamente esas propiedades en el frijol? – davorp

1

Agregando a su controlador el método

@Override 
protected String getFieldBindingPrefix() { 
    return "filter."; 
} 

debe hacer el trabajo.

+0

¿Puedes explicar la respuesta un poco más? No he encontrado nada sobre ese método en Google. No hay ningún método "getFieldBindingPrefix()" para anular en mi clase de controlador. :-( – raspayu

Cuestiones relacionadas