2012-01-19 22 views
7

Estoy enviando datos de JSP al controlador mediante la cadena de consulta.Valor de RequestParam en Spring MVC que no distingue entre mayúsculas y minúsculas

Mi controlador es anotado.

El valor del parámetro de solicitud no debe tener en cuenta las mayúsculas y minúsculas.

El método que utilizo para la página de bienvenida es

public String welcome(@RequestParam("orgID") String orgID, ModelMap model) 

El parámetro de la petición "OrgID" debe ser sensible a mayúsculas. Como hacer esto ?.

Debería poder dar la cadena de consulta como "orgid" u "orgId". El parámetro debe ser completamente insensible a mayúsculas y minúsculas. Buscando a tus amigos de ayuda.

Gracias de antemano :-)

+2

Si esta solicitud el nombre del parámetro tuvo que ser ingresado manualmente por un usuario final, me gustaría entender por qué esto sería deseable. Pero es tu propio código el que debe generar cadenas de consulta apropiadas. ¿Por qué no simplemente respetas el nombre de param esperado? Elija las convenciones de nombres y cúmplalas. –

+0

En realidad, dos o tres aplicaciones externas acceden a esta URL. Uno daría el string de consulta como "orgID", uno daría como "orgId" y otro daría como "orgid" y otro como "Orgid". No puedo esperar cuántas solicitudes darían y en cuántos patrones. Así que quería tenerlo como insensible a las mayúsculas y minúsculas :-) – Arun

+1

¿Y por qué no arreglar estas aplicaciones? Una vez que tenga los parámetros que no distinguen entre mayúsculas y minúsculas, usarán la URL incorrecta. Si los desarrolladores de estas aplicaciones externas no pueden respetar un contrato tan simple, no deberían arreglar nada, y deberían aprender cómo hacer su trabajo. –

Respuesta

0

Hay una solución simple. Puede operar directamente en HttpServletRequest y usar el método getParameter() y verificar todas las versiones del parámetro.

public String welcome(HttpServletRequest request, ModelMap model){ 
    String orgID = extractOrgId(request); 
    //rest of your code 
} 

private String extractOrgId(HttpServletRequest request){ 
    if(request.getParameter("orgId") != null){ 
     return request.getParameter("orgId"); 
    } 
    // and so on 
} 
+0

Muy buen trabajo :-). Utilizo esta solución a partir de ahora. Pero me complacería cualquier otra solución en la primavera, que tomará los parámetros de la solicitud entrante y convertirá en minúsculas y luego procesar más ... – Arun

3

Usted tendrá que intentar cambiar la primavera guerra coincide con sus URL. Por un lado, puede crear un filtro (probablemente un DelegatingFilterProxyBean) para minúsculas de su parámetro antes de pasarlo a Spring o tratar de cambiar la forma en que coinciden las rutas.

Encontrará una explicación para las segundas opciones en How can I have case insensitive URLS in Spring MVC with annotated mappings.

+0

Hola Aravind. Si no estoy equivocado, el enlace que pegas aquí está diciendo cómo hacer que la ruta no distinga entre mayúsculas y minúsculas y no el parámetro particular – Arun

+1

@Arun yup. Supongo que la ruta incluirá el parámetro. De lo contrario, puede tener que minúsculas usando un filtro o algo así. –

+0

Intenté como se aconseja en ese enlace. Pero incluye solo la ruta y no el parámetro :-(. Tengo que buscar alguna otra opción ahora :-( – Arun

3

Otro enfoque sería tener dos parámetros "orgId" y "orgid" y tener el opcional.

public String welcome(@RequestParam(value="orgID", required = false) String org_ID, @RequestParam(value="orgid", required=false, String orgid, ModelMap model) { 
final String orgId = orgid == null ? org_ID : orgid; 
... 
} 

Pero si usted tiene control sobre los parámetros que preferiría firmemente que sólo tienen una forma consistente, decir org-id y seguirlo tanto en el cliente y el servidor.

0

Puede ser bueno para Spring admitir esto, pero también puedo entender por qué no lo harían ya que podría resultar en un debilitamiento de un contrato de interfaz entre un proveedor y un consumidor. Mientras tanto, aquí hay una manera bastante sencilla de tomar el primer valor usando el nombre del parámetro, independientemente de su caso.

String myVal = null; 
    for (String pname : request.getParameterMap().keySet()) { 
     if (pname != null && pname.toLowerCase().equals("your_lc_pname")) { 
      for (String v : request.getParameterValues(pname)) { 
       // do something with your value(s) 
      } 
     } 
    } 
1

en la primavera 4.2+

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages="org.saat") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configurePathMatch(PathMatchConfigurer configurer) { 
     AntPathMatcher matcher = new AntPathMatcher(); 
     matcher.setCaseSensitive(false); 
     configurer.setPathMatcher(matcher); 
    } 

    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new 
InternalResourceViewResolver(); 
     viewResolver.setPrefix("/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

} 
Cuestiones relacionadas