public Map<String, Object> login(@PathVariable("loginParams") String loginParams)
public interface HandlerMethodArgumentResolver {
/**
* 判断方法参数是否包含指定的参数注解
* 含有返回true,不含有返回false
*/
boolean supportsParameter(MethodParameter parameter);
/**
* 在给定的具体的请求中,把方法的参数解析到参数值里面,返回解析到的参数值,没有返回null
* 只有在supportsParameter返回true的时候,resolveArgument方法才会执行
*/
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
}
public class PathVariableMethodArgumentResolver extends AbstractNamedValueMethodArgumentResolver
implements UriComponentsContributor {
/*
* 这里省略其它方法
*
/
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 不含有PathVariable注解,返回false
if (!parameter.hasParameterAnnotation(PathVariable.class)) {
return false;
}
// PathVariable注解的参数类型是Map类型
if (Map.class.isAssignableFrom(parameter.getParameterType())) {
String paramName = parameter.getParameterAnnotation(PathVariable.class).value();
return StringUtils.hasText(paramName);
}
return true;
}
// PathVariableMethodArgumentResolver没有重写resolveArgument,直接使用AbstractNamedValueMethodArgumentResolver默认行为
/*
* 如果supportsParameter返回true,在这里真正处理参数
*
*/
protected void handleResolvedValue(Object arg, String name, MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest request) {
String key = View.PATH_VARIABLES;
int scope = RequestAttributes.SCOPE_REQUEST;
Map<String, Object> pathVars = (Map<String, Object>) request.getAttribute(key, scope);
if (pathVars == null) {
pathVars = new HashMap<String, Object>();
request.setAttribute(key, pathVars, scope);
}
// 把参数的key-value放进请求域,也就是把值赋给了方法参数,比如请求路径是: api/v1/task/{id},方法参数@PathVariable("id") String taskId,那么此时name=taskId, org=id的值
// 当然,怎么把请求地址中对应的值获取出来,不在这篇博客的讨论范畴。大家只要记得参数注解是这样解析处理的就可以了
pathVars.put(name, arg);
}
}
public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Class<?> paramType = parameter.getParameterType();
// 获取请求参数的key-value
NamedValueInfo namedValueInfo = getNamedValueInfo(parameter);
// 解析参数名
Object arg = resolveName(namedValueInfo.name, parameter, webRequest);
if (arg == null) {
if (namedValueInfo.defaultValue != null) {
arg = resolveDefaultValue(namedValueInfo.defaultValue);
}
else if (namedValueInfo.required && !parameter.getParameterType().getName().equals("java.util.Optional")) {
handleMissingValue(namedValueInfo.name, parameter);
}
arg = handleNullValue(namedValueInfo.name, arg, paramType);
}
else if ("".equals(arg) && namedValueInfo.defaultValue != null) {
arg = resolveDefaultValue(namedValueInfo.defaultValue);
}
// 数据绑定
if (binderFactory != null) {
WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name);
try {
arg = binder.convertIfNecessary(arg, paramType, parameter);
}
catch (ConversionNotSupportedException ex) {
throw new MethodArgumentConversionNotSupportedException(arg, ex.getRequiredType(),
namedValueInfo.name, parameter, ex.getCause());
}
catch (TypeMismatchException ex) {
throw new MethodArgumentTypeMismatchException(arg, ex.getRequiredType(),
namedValueInfo.name, parameter, ex.getCause());
}
}
/*
* 最后的处理是交给handleResolvedValue,handleResolvedValue方法是抽象方法,我们回来看看一下PathVariableMethodArgumentResolver的handleResolvedValue方法是抽象方法的具体实现
*
*/
handleResolvedValue(arg, namedValueInfo.name, parameter, mavContainer, webRequest);
return arg;
}
package top.mingzhijie.demo.springmvc.anntation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** 代表当前任务
* @author wunanliang
* @date 2017/10/21
* @since 1.0.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface CurrentTask {
String value() default "";
}
package top.mingzhijie.demo.springmvc.method.arguments.anntation;
import top.mingzhijie.demo.springmvc.entity.Task;
import java.util.HashMap;
import java.util.Map;
/**
* 模拟任务业务类
*
* @author wunanliang
* @date 2017/10/21
* @since 1.0.0
*/
public class TaskService {
private static Map<String, Task> taskMap = new HashMap<String, Task>();
static {
taskMap.put("001", new Task("task1", 10, true));
taskMap.put("002", new Task("task2", 1, false));
taskMap.put("003", new Task("task3", 20, false));
}
public static Task findTaskById(String taskId) {
return taskMap.get(taskId);
}
}
package top.mingzhijie.demo.springmvc.entity;
/**
* @author wunanliang
* @date 2017/10/21
* @since 1.0.0
*/
public class Task {
private String name;
private int resolvedCount; // 参与人数
private boolean allowStudent;
public Task(){}
public Task(String name, int resolvedCount, boolean allowStudent) {
this.name = name;
this.resolvedCount = resolvedCount;
this.allowStudent = allowStudent;
}
public boolean isAllowStudent() {
return allowStudent;
}
public void setAllowStudent(boolean allowStudent) {
this.allowStudent = allowStudent;
}
public int getResolvedCount() {
return resolvedCount;
}
public void setResolvedCount(int resolvedCount) {
this.resolvedCount = resolvedCount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Task{" +
"name='" + name + '\'' +
", resolvedCount=" + resolvedCount +
", allowStudent=" + allowStudent +
'}';
}
}
package top.mingzhijie.demo.springmvc.method.arguments.anntation;
import org.springframework.core.MethodParameter;
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 top.mingzhijie.demo.springmvc.anntation.CurrentTask;
import top.mingzhijie.demo.springmvc.entity.Task;
/**
* @author wunanliang
* @date 2017/10/21
* @since 1.0.0
*/
public class TaskHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
public boolean supportsParameter(MethodParameter methodParameter) {
boolean hasAnn = methodParameter.hasParameterAnnotation(CurrentTask.class);
return hasAnn;
}
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
Task task = null;
String curTaskId = (String) nativeWebRequest.getParameter("cur_task_id");
if (curTaskId != null && !"".equals(curTaskId)) {
task = TaskService.findTaskById(curTaskId);
}
if (task == null) {
System.out.println("为找到对应的任务");
} else {
if (task.isAllowStudent()) {
System.out.println("当前任务不允许学生参加哦");
} else {
System.out.println("学生可以参加当前任务哦");
}
}
return task;
}
}
package top.mingzhijie.demo.springmvc.method.arguments.anntation;
import org.springframework.web.bind.annotation.*;
import top.mingzhijie.demo.springmvc.anntation.CurrentTask;
import top.mingzhijie.demo.springmvc.entity.Task;
import java.util.HashMap;
import java.util.Map;
/**
* @author wunanliang
* @date 2017/10/21
* @since 1.0.0
*/
@RestController
@RequestMapping("/tasks")
public class TaskController {
// 这里使用@CurrentTask来表示Task参数
@RequestMapping(value = "/join", method = RequestMethod.GET)
@ResponseBody
public Map<String, Task> gJoinTask(@RequestParam("cur_task_id") String taskId, @CurrentTask Task task) {
System.out.println(task);
Map<String, Task> map = new HashMap<String, Task>();
map.put("cur_task", task);
return map;
}
}
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="top.mingzhijie.demo.springmvc.method.arguments.anntation.TaskHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
{
"cur_task": {
"name": "task1",
"resolvedCount": 10,
"allowStudent": true
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有