Значение RequestParam в spring MVC должно быть нечувствительным к регистру

Я отправляю данные из JSP в контроллер с помощью строки запроса.

мой контроллер управляется аннотацией.

значение параметра запроса должен быть нечувствительным к регистру.

метод, который я использую для добро пожаловать страницы

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

параметр запроса "orgID"должен быть нечувствительным к регистру. Как это сделать ?.

Я должен иметь возможность дать строку запроса как "orgid"или " orgId". Параметр должен быть полностью без учета регистра. Ищу ваших друзей помощи.

заранее спасибо :-)

6 ответов


существует простой обходной путь.Вы можете работать непосредственно с HttpServletRequest и использовать метод getParameter () и проверять все версии параметра.

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
}

вам нужно будет попробовать изменить весеннюю войну, соответствующую вашим URL-адресам . Вы можете, например, создать фильтр (возможно, DelegatingFilterProxyBean), чтобы уменьшить регистр вашего параметра, прежде чем передавать его Spring или пытаться изменить способ сопоставления путей .

объяснение второго варианта дается в как я могу иметь нечувствительные к регистру URL-адреса в Spring MVC с аннотированными сопоставлениями .


другим подходом было бы иметь два параметра "orgId" и "orgid" и иметь необязательный.

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;
...
}

но если у вас есть контроль над параметрами, я бы предпочел иметь только один согласованный способ, скажем org-id и следовать ему как на стороне клиента, так и на стороне сервера.


весной 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;
    }

}

было бы неплохо для Spring поддержать это, но я также могу понять, почему они не будут, так как это может привести к ослаблению контракта интерфейса между поставщиком и потребителем. Тем временем, вот довольно простой способ взять первое значение, используя имя параметра независимо от его случая.

    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)
            }
        }
    }

самым простым способом, который я нашел, было изменить метод контроллера, чтобы взять карту с одной парой значений ключа в качестве параметра, а затем преобразовать ключ в нижний регистр.

public String welcome(@RequestParam(required = true) Map<String, String> params, ModelMap model) {
   String caseInsensitiveOrgId = params.keySet().toArray()[0].toString().toLowerCase();
   String OrgValue = params.values().toArray()[0];
   // Do whatever you want here
}