重写addArgumentResolvers后不生效

来源:3-7 分布式session下

Happydak

2018-09-23

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回答

若鱼1919

2018-09-24

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

1
2
慕神8251567_君君
回复
Happydak
我也遇到一样的问题,困扰一天了。if(StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(paramToken)) 改成if(StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(cookieToken))就好了[捂脸]
2018-10-12
共2条回复

Java秒杀系统方案优化 掌握海量访问通用解决方案

各种缓存/JSR303参数检

2704 学习 · 941 问题

查看课程