代码之家  ›  专栏  ›  技术社区  ›  Brandon Yarbrough

spring@mvc和@requestparam验证

  •  7
  • Brandon Yarbrough  · 技术社区  · 14 年前

    我想使用@requestparam注释,如下所示:

    @RequestMapping
    public void handleRequest( @RequestParam("page") int page ) {
       ...
    }
    

    但是,如果用户篡改了URL参数并试图转到“abz”页或其他非数字页,我想显示第1页。现在,我能让斯普林做的最好的事情就是返回500。是否有一种方法可以完全重写此行为而不必将参数作为字符串接收?

    我查看了@exceptionhandler注释,但当我设置使用时,它似乎不起任何作用。 @ExceptionHandler(TypeMismatchException.class) . 不知道为什么。

    建议?

    P.S.奖金问题:SpringMVC被称为SpringMVC。带有注释的SpringMVC是否称为spring@mvc?谷歌把他们当成同一个名字,这很烦人。

    2 回复  |  直到 13 年前
        1
  •  8
  •   axtavt    14 年前

    从Spring3.0开始,您可以设置 ConversionService . @InitBinder value 指定要将该服务应用于的特定参数:

    @InitBinder("page")
    public void initBinder(WebDataBinder binder) {
        FormattingConversionService s = new FormattingConversionService();
        s.addFormatterForFieldType(Integer.class, new Formatter<Integer>() {
            public String print(Integer value, Locale locale) {
                return value.toString();
            }
    
            public Integer parse(String value, Locale locale)
                    throws ParseException {
                try {
                    return Integer.valueOf(value);
                } catch (NumberFormatException ex) {
                    return 1;
                }
            }
        });
        binder.setConversionService(s);
    }
    
        2
  •  10
  •   Janning Vygen    13 年前

    这个 ConversionService 是一个很好的解决方案,但是如果向请求提供一个空字符串,比如 ?page= ConversionService根本不需要调用,但是 page 设置为 null (万一) Integer )或者抛出异常(在 int )

    这是我的首选解决方案:

    @RequestMapping
    public void handleRequest( HttpServletRequest request ) {
        int page = ServletRequestUtils.getIntParameter(request, "page", 1);
    }
    

    这样,您总是有一个有效的int参数。