栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记录ResponseBodyAdvice< Object > 不生效

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录ResponseBodyAdvice< Object > 不生效

2022-06-09 记录 ResponseBodyAdvice< Object > 不生效 1.不生效写法
	@PostMapping("/login")
    public void login(@RequestBody LoginInfoVo vo,HttpServletResponse response) {
        //从redis中获取保存的验证码
        String code = jedisPool.getResource().get(RedisMessageConstant.SENDTYPE_LOGIN + vo.getTelephone());
        if (!(vo.getValidateCode() != null && code != null && code.equals(vo.getValidateCode()))) {
            throw new MyException("验证码错误");
        }
        loginService.login(vo);
        Cookie cookie = new Cookie("telephone", vo.getTelephone());
        cookie.setPath("/");
        cookie.setMaxAge(60 * 60 * 24 * 30);
        response.addCookie(cookie);
    }
2.生效写法
	//1.
	@PostMapping("/login")
    public BigDecimal login(@RequestBody LoginInfoVo vo,HttpServletResponse response) {
        //从redis中获取保存的验证码
        String code = jedisPool.getResource().get(RedisMessageConstant.SENDTYPE_LOGIN + vo.getTelephone());
        if (!(vo.getValidateCode() != null && code != null && code.equals(vo.getValidateCode()))) {
            throw new MyException("验证码错误");
        }
        loginService.login(vo);
        Cookie cookie = new Cookie("telephone", vo.getTelephone());
        cookie.setPath("/");
        cookie.setMaxAge(60 * 60 * 24 * 30);
        response.addCookie(cookie);
        return BigDecimal.ZERO;
    }
    //2.
    @PostMapping("/login")
    public void login(@RequestBody LoginInfoVo vo) {
        //从redis中获取保存的验证码
        String code = jedisPool.getResource().get(RedisMessageConstant.SENDTYPE_LOGIN + vo.getTelephone());
        if (!(vo.getValidateCode() != null && code != null && code.equals(vo.getValidateCode()))) {
            throw new MyException("验证码错误");
        }
        loginService.login(vo);
    }
入参中有HttpServletResponse需要有返回值ResponseBodyAdvice才会生效 原因 spring源码分析 ServletInvocableHandlerMethod.java

没有返回值时走下面代码mavContainer.isRequestHandled()==true会直接return 不走返回值处理逻辑

		if (returnValue == null) {
			if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
				mavContainer.setRequestHandled(true);
				return;
			}
		}
		else if (StringUtils.hasText(getResponseStatusReason())) {
			mavContainer.setRequestHandled(true);
			return;
		}
返回值处理逻辑
	mavContainer.setRequestHandled(false);
		Assert.state(this.returnValueHandlers != null, "No return value handlers");
		try {
			this.returnValueHandlers.handleReturnValue(
					returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
		}
		catch (Exception ex) {
			if (logger.isTraceEnabled()) {
				logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
			}
			throw ex;
		}
但是mavContainer.isRequestHandled()默认值为false
	public boolean isRequestHandled() {
		return this.requestHandled;
	}
只有在入参里面有HttpServletResponse时,匹配对应的参数解析器 ServletResponseMethodArgumentResolver执行resolveArgument方法时把requestHandled置为了true 方法作用:让调用的方法获得访问HttpServletResponse的权限,同时把状态置为请求已处理,我们就能在方法里面处理返回请求
	
	@Override
	public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {

		if (mavContainer != null) {
			mavContainer.setRequestHandled(true);
		}

		Class paramType = parameter.getParameterType();

		// ServletResponse, HttpServletResponse
		if (ServletResponse.class.isAssignableFrom(paramType)) {
			return resolveNativeResponse(webRequest, paramType);
		}

		// ServletResponse required for all further argument types
		return resolveArgument(paramType, resolveNativeResponse(webRequest, ServletResponse.class));
	}
总结 入参有HttpServletResponse 时,spring参数解析器ServletResponseMethodArgumentResolver把返回请求处理交给我们处理,mavContainer置为已处理,如果没有返回值且mavContainer状态为已处理spring就默认我们处理了返回请求,spring就不处理,如果有返回值spring就还是会处理
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/963855.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号