周梦康 发表于 2016-01-12 3707 次浏览 标签 : SpringMVC
@Controller
@RequestMapping("/")
public class Authorization{

    @RequestMapping(value = "/tel/login", method = RequestMethod.POST, produces = "text/json;charset=UTF-8")
    public
    @ResponseBody
    String telLogin(@RequestParam(required = true) String tel,
                    @RequestParam(required = true) String password){
        Info info = new Info();
        return new Result<>(info).toJsonString();
    }

}

比如当我没有传入tel字符串的时候,则会返回HTTP/1.1 400 Bad Request,内容为空。

尝试着使用拦截器来处理:

前提还需要吧上面的@RequestParam加上value标识,@RequestParam(value = "tel",required = true)。然后通过拦截器的preHandle来处理

public class ParametersInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean hasNull = false;
        StringBuilder stringBuilder = new StringBuilder();

        HandlerMethod method = (HandlerMethod) handler;
        MethodParameter[] methodParams = method.getMethodParameters();
        for(MethodParameter param : methodParams) {
            RequestParam requestParam = param.getParameterAnnotation(RequestParam.class);
            if(null != requestParam && requestParam.required()) {
                if(null == request.getParameter(requestParam.value())) {
                    stringBuilder.append("[").append(requestParam.value()).append("]")
                            .append(" cannot be null ! ");
                    hasNull = true;
                }
            }
        }
        System.out.println(stringBuilder.toString());
        return !hasNull;

    }
}

上面的代码只能拦截到是否为空,如果要实现类型判断,恐怕还要把Spring参数映射的那套东西重新写一次,如此就整个框架就执行了两遍了。再者,这里返回值是布尔值,没法把自定义的错误返回给客户端。

所以这个思路不行。

👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表

回复 路人甲 2016-03-09 11:35:42
response.getWriter().write("something");
return false;