请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

重写addArgumentResolvers后不生效

1 问题描述
按照老师上课敲得代码,通过重写addArgumentResolvers实现token信息获取时总是失败【在进入到商品controller时不能获取到User信息】,然后总是报错误:EL1007E: Property or field ‘nickname’ cannot be found on null;就是通过重写addArgumentResolvers时不能有效获取到User信息
图片描述

2 代码
2.1 配置类

@Configuration
//@Slf4j
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    public MiaoshaUserArgumentResolver miaoshaUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
//        log.info("=============hello");
//        resolvers.add(new MiaoshaUserArgumentResolver());
        resolvers.add(miaoshaUserArgumentResolver);
    }

}

2.2 MiaoshaUserArgumentResolver

package com.xunyji.miaosha.config;

import com.sun.deploy.net.HttpResponse;
import com.xunyji.miaosha.domain.model.MiaoshaUser;
import com.xunyji.miaosha.service.MiaoshaUserService;
import com.xunyji.miaosha.service.impl.MiaoshaUserServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 王杨帅
 * @create 2018-09-23 21:25
 * @desc
 **/
@Component
//@Slf4j
public class MiaoshaUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private MiaoshaUserServiceImpl miaoshaUserServiceImpl;

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> parameterType = methodParameter.getParameterType();
        return parameterType == MiaoshaUser.class;
    }

    @Override
    public Object resolveArgument(
            MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
            NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {

        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);

        String paramToken = request.getParameter(MiaoshaUserServiceImpl.COOKI_NAME_TOKEN);
        String cookieToken = getCookieValue(request, MiaoshaUserServiceImpl.COOKI_NAME_TOKEN);

        if (paramToken == null && paramToken == null) {
            return null;
        }

        String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken;
//        log.info("token: " + token);
        MiaoshaUser byToken = miaoshaUserServiceImpl.getByToken(response, token);
//        log.info("byToken:" + byToken);
        return byToken;

    }

    private String getCookieValue(HttpServletRequest request, String cookiNameToken) {
        Cookie[] cookies = request.getCookies();

        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(cookiNameToken)) {
                return cookie.getValue();
            }
        }

        return null;
    }
}

2.3 GoodsController

package com.xunyji.miaosha.controller;

import com.xunyji.miaosha.domain.model.MiaoshaUser;
import com.xunyji.miaosha.service.MiaoshaUserService;
import com.xunyji.miaosha.service.impl.MiaoshaUserServiceImpl;
import com.xunyji.miaosha.utils.redis.MiaoshaUserKey;
import com.xunyji.miaosha.utils.redis.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * @author 王杨帅
 * @create 2018-09-23 20:27
 * @desc
 **/
@Controller
@RequestMapping(value = "/goods")
@Slf4j
public class GoodsController {

    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private MiaoshaUserService miaoshaUserService;

    @GetMapping(value = "/to_list")
    public String toList(
            Model model,
//            HttpServletResponse response,
//            @CookieValue(value = MiaoshaUserServiceImpl.COOKI_NAME_TOKEN, required = false) String cookieToken,
//            @RequestParam(value = MiaoshaUserServiceImpl.COOKI_NAME_TOKEN, required = false) String paramToken
//            ,
            MiaoshaUser miaoshaUser
    ) {

//        if (cookieToken == null && paramToken == null) {
//            return "login";
//        }
//        String token = paramToken != null ? paramToken : cookieToken;
//        MiaoshaUser miaoshaUser = miaoshaUserService.getByToken(response, token);

        log.info("获取到的用户细腻Wie:" + miaoshaUser);

        model.addAttribute("user", miaoshaUser);
        return "goods_list";
    }

}


正在回答

1回答

这个打断点 单步调试一下吧

1 回复 有任何疑惑可以回复我~
  • 提问者 Happydak #1
    已经找到原因:在resolveArgument里面进行token非空验证时只验证了paramToken,所以导致直接返回啦。谢谢你,老师。
    回复 有任何疑惑可以回复我~ 2018-09-24 13:45:53
  • 慕神8251567_君君 回复 提问者 Happydak #2
    我也遇到一样的问题,困扰一天了。if(StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(paramToken))
    改成if(StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(cookieToken))就好了[捂脸]
    回复 有任何疑惑可以回复我~ 2018-10-12 22:41:05
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号