1.创建一个HandlerMethodArgumentResolver。
package com.ciih.axj.resolver;
import com.ciih.axj.model.UserPlus;
import com.ciih.axj.model.User;
import com.ciih.axj.myAnnotations.UserIn;
import com.ciih.axj.service.UserPlusService;
import com.ciih.axj.service.UserService;
import com.ciih.axj.util.EmptyUtils;
import com.ciih.axj.util.JwtTokenUtilPlus;
import com.ciih.axj.util.UserInfo;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
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.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@Component
public class RequestUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Resource
private UserService userService;
@Resource
private UserPlusService userPlusService;
@Resource
private HttpServletRequest request;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(UserIn.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) {
String token = request.getParameter("Authorization");
if (token == null) {
token = request.getHeader("Authorization");
}
if (token == null) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("Authorization".equals(cookie.getName())) {
token = cookie.getValue();
}
}
}
}
Assert.notNull(token, "未检测到token");
UserInfo userInfo = JwtTokenUtilPlus.parseToken001(token, com.ciih.axj.util.UserInfo.class);
User user=userService.lambdaQuery().eq(User::getLoginName,userInfo.getUsername()).one();
if(EmptyUtils.isNotEmpty(user)){
user.setDistrictId(user.getOrgId());
UserPlus one = userPlusService.lambdaQuery().eq(UserPlus::getCreNum, user.getCredNum()).one();
if(EmptyUtils.isNotEmpty(one)){
user.setUserPlus(one);
user.setDistrictId(one.getOrgId());
}
}
return user;
}
}
2.在WebMvcConfigurer中注册解析器
package com.ciih.axj.config;
import com.ciih.axj.resolver.RequestUserHandlerMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private RequestUserHandlerMethodArgumentResolver requestUserHandlerMethodArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(requestUserHandlerMethodArgumentResolver);
}
}
3.实现自定义注解,作为解析参数的标志
package com.ciih.axj.myAnnotations;
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserIn {
}
4.在控制器中的方法里使用自动参数解析
package com.ciih.axj.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ciih.axj.model.User;
import com.ciih.axj.myAnnotations.CheckUserType;
import com.ciih.axj.service.UserService;
import com.ciih.axj.util.EmptyUtils;
import com.ciih.axj.util.ServiceResult;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.ciih.axj.myAnnotations.UserIn;
/**
* (User)表控制层
*
* @author zzw
* @since 2021-07-23 13:23:06
*/
@RestController
@RequestMapping("user")
public class UserController extends BaseController {
@Resource
private UserService userService;
@ApiOperation(value = "学校管理员-根据条件查人员列表", httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name="page",value="页",dataType="int",required=true,paramType = "query"),
@ApiImplicitParam(name="pageCount",value="行数",dataType="int",required=true,paramType = "query"),
@ApiImplicitParam(name="userName",value="姓名",dataType="String",required=false,paramType = "query"),
@ApiImplicitParam(name="phone",value="电话",dataType="String",required=false,paramType = "query"),
@ApiImplicitParam(name="creNum",value="身份证号",dataType="String",required=false,paramType = "query"),
@ApiImplicitParam(name="orgId",value="组织id",dataType="String",required=false,paramType = "query")
})
@PostMapping("/getUsers")
@CheckUserType({"system"})
public ServiceResult getUsers(HttpServletRequest request, @RequestParam Integer page,
@RequestParam Integer pageCount, String userName, String phone, String creNum, String orgId, @UserIn User user){
//1校验身份
//2查询用户列表
QueryWrapper<User> userQueryWrapper=new QueryWrapper<>();
if(EmptyUtils.isNotEmpty(userName)){
userQueryWrapper.lambda().eq(User::getUserName,userName);
}
if(EmptyUtils.isNotEmpty(phone)){
userQueryWrapper.lambda().eq(User::getPhone,phone);
}
if(EmptyUtils.isNotEmpty(creNum)){
userQueryWrapper.lambda().eq(User::getCredNum,creNum);
}
if(EmptyUtils.isNotEmpty(orgId)){
userQueryWrapper.lambda().eq(User::getOrgId,orgId);
}
IPage<User> userIPage=userService.page(new Page<>(page,pageCount),userQueryWrapper);
return ServiceResult.success(userIPage,request);
}
}
这样就可以在controller层的方法参数里面 通过@UserIn User user 直接获取到user的对象,非常方便。