`

SpringMVC杂记(十七) HandlerMethodArgumentResolver接口应用example

 
阅读更多
自从spring3.1 开始就有了这个接口,可以为@RequestMapping标注的方法扩展传入的参数。
以shiro为例,扩展一个标注,@CurrentUser,只要有这个标注,就可以在shiro的安全上下文中取出适当的对象直接从参数传入,request响应函数。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}

@RequestMapping(value = "/test1")
public @ResponseBody String test1(@CurrentUser Long userId) {
	return userId.toString();
}

@RequestMapping(value = "/test2")
public @ResponseBody String test2(@CurrentUser UserDetails userDetails) {
	return userDetails.toString();
}

import java.lang.annotation.Annotation;

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 com.github.yingzhuo.mycar2.annotation.CurrentUser;
import com.github.yingzhuo.mycar2.security.SecurityUtils;
import com.github.yingzhuo.mycar2.security.UserDetails;

public class CurrentUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		Class<?> klass = parameter.getParameterType();
		if (klass.isAssignableFrom(UserDetails.class) || klass.isAssignableFrom(Long.class)) {
			Annotation[] as = parameter.getParameterAnnotations();
			for (Annotation a : as) {
				if (a.annotationType() == CurrentUser.class) {
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
			WebDataBinderFactory binderFactory) throws Exception {
		
		if ((SecurityUtils.isAuthenticated() || SecurityUtils.isRemembered()) == false) {
			return null;
		}
		
		Class<?> klass = parameter.getParameterType();
		
		UserDetails userDetails = SecurityUtils.getUserDetails();
		
		if (klass.isAssignableFrom(UserDetails.class)) {
			return SecurityUtils.getUserDetails();
		}
		
		if (klass.isAssignableFrom(Long.class)) {
			return userDetails != null ? userDetails.getId() : null;
		}
		
		return null;
	}
}

最后,需要配置一下
<mvc:annotation-driven>
	<mvc:argument-resolvers>
		<bean class="xxx.yyy.CurrentUserHandlerMethodArgumentResolver" />
	</mvc:argument-resolvers>
</mvc:annotation-driven>

分享到:
评论
2 楼 zxl410970953 2015-12-30  
ly10265139 写道
不错,很懂,很明白
    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
        Class<?> klass = parameter.getParameterType(); 
        if (klass.isAssignableFrom(UserDetails.class) || klass.isAssignableFrom(Long.class)) { 
            Annotation[] as = parameter.getParameterAnnotations(); 
            for (Annotation a : as) { 
                if (a.annotationType() == CurrentUser.class) { 
                    return true; 
                } 
            } 
        } 
        return false; 
    } 

只是不明白这一块是干嘛的?



判断哪些类型支持这个resolver,条件是参数类型为userdetails,或者long, 且带有CurrentUser注解的
1 楼 ly10265139 2015-12-24  
不错,很懂,很明白
    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
        Class<?> klass = parameter.getParameterType(); 
        if (klass.isAssignableFrom(UserDetails.class) || klass.isAssignableFrom(Long.class)) { 
            Annotation[] as = parameter.getParameterAnnotations(); 
            for (Annotation a : as) { 
                if (a.annotationType() == CurrentUser.class) { 
                    return true; 
                } 
            } 
        } 
        return false; 
    } 

只是不明白这一块是干嘛的?

相关推荐

    SpringMVC4.2 开发Rest接口

    SpringMVC 4.2是Spring框架的一个重要版本,它专为构建现代Web应用程序而设计,特别是对于RESTful(Representational State Transfer)接口的开发。REST是一种架构风格,用于构建可伸缩、易于理解的分布式系统,强调...

    SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

    SpringMVC 3.1.1版本的源码中,Controller接口和相关注解(如@RequestMapping、@SessionAttributes、@ModelAttribute)的实现提供了上述功能的基础。通过阅读源码,我们可以更深入地理解这些特性的内部工作原理。 ...

    SpringMVC杂记(五) JSR303数据验证

    在本篇《SpringMVC杂记(五) JSR303数据验证》中,我们将深入探讨SpringMVC框架如何集成并使用JSR303(JavaBeans Validation)来进行数据验证,这是一种强大的验证机制,可以确保应用程序接收到的数据是合法且符合...

    SpringMVC 开发接口demo

    在这个"SpringMVC 开发接口demo"中,我们将深入探讨如何使用SpringMVC构建RESTful API,以便于开发人员进行数据交互。 1. **SpringMVC基本概念** - **DispatcherServlet**:作为SpringMVC的前端控制器,接收所有...

    SpringMVC 开发json接口Demo(含数据库)

    SpringMVC 开发json接口Demo(含数据库、jar包)。包含:1、SpringMVC 开发json接口.docx;2、springmvc_project.rar;3、students_manage.sql

    SpringMVC构建REST接口的源代码

    SpringMVC 是一个基于 Spring 框架的轻量级 Web 开发模块,它使得开发者可以轻松地构建可复用、可维护的 MVC(Model-View-Controller)应用程序。REST(Representational State Transfer)是一种软件架构风格,常...

    springmvc做的接口

    SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。这个接口示例是基于SpringMVC构建的,主要用于处理客户端的JSON请求并返回JSON响应,非常适合初学者学习。 在SpringMVC中...

    后端SpringMvc框架Web接口

    SpringMvc实现移动接口开发,使用RestFul的url风格的接口开发,实现语言java,该Demo只是一个简单的项目例子,便于学习理解,该项目数据库sql有误读者自己创建:数据库(student_manage),表名(student),字段(id,...

    SpringMVC构建REST接口:第四篇 第一个REST风格的接口的源代码

    在本篇中,我们将深入探讨如何使用Spring MVC构建RESTful接口,主要关注的是...在"SpringMVC构建REST接口:第四篇 第一个REST风格的接口的源代码"这个主题中,你将找到一个完整的示例,帮助你更好地理解和实践这些知识。

    基于springMVC 的restful风格接口前后端使用说明

    在基于SpringMVC的开发框架中,Restful风格的接口设计越来越受到前后端开发者的青睐。Restful接口以其简洁、高效和易于理解的特点,很好地满足了前后端分离的开发模式。本说明将详细介绍如何在SpringMVC环境下设计并...

    SpringMVC源码总结(十)自定义HandlerMethodArgumentResolver

    这篇博客“SpringMVC源码总结(十)自定义HandlerMethodArgumentResolver”深入探讨了这一主题,旨在帮助读者理解如何扩展Spring MVC的功能,实现自定义的处理器方法参数解析。 首先,我们来看`...

    springmvc简单框架提供的jsonp服务端接口

    在IT行业中,SpringMVC是Java企业级应用开发中广泛使用的Web MVC框架,它提供了模型-视图-控制器(MVC)模式的实现,使得开发者能够更高效地构建可维护和可扩展的Web应用程序。本篇文章将深入探讨如何利用SpringMVC...

    SpringMVC-Json-Example

    这个教程,将会向你展示如何在Spring MVC框架中返回JSON格式内容。 使用到的技术: Spring 3.2.2.RELEASE Jackson 1.9.10 JDK 1.6 Eclipse 3.6 Maven 3 PS:在Spring 3 版本,只需要将JackSon包放在classpath根目录...

    springmvc2.5.6实现rest接口实例

    1、访问地址:http://localhost:8080/springmvc/user/hello?userId=123456 2、配置步骤: 1)引入架包;...3以上版本就支持@PathVariable注解,允许的话,建议采用SpringMVC4,增加了一些新特性 ;

    SpringMVC 多版本接口/IP访问控制/ANT打包发布到LINUX

    在IT行业中,SpringMVC作为一个强大的Java Web框架,被广泛应用于构建RESTful API服务。本教程将探讨如何在SpringMVC中实现多版本接口管理、IP访问控制以及使用ANT工具进行打包并部署到Linux服务器。 首先,让我们...

    springMvc data jpa example

    在 "springMvc data jpa example" 中,我们将探讨如何将这两者结合使用,创建一个基于 Spring 3.1.2 和 Spring Data JPA 1.3.1 的示例应用。 首先,让我们深入了解 Spring MVC。Spring MVC 提供了一个模型-视图-...

    数据库mongdb+springmvc+framework的最新应用

    MongoDB、SpringMVC和Spring Framework是现代Java开发中常用的技术栈,它们分别在数据库管理、Web应用程序构建和整体框架支持方面发挥着重要作用。在这个最新的应用组合中,这些技术协同工作,提供高效、灵活和可...

    springmvc实战应用

    本文将详细介绍SpringMVC在实战中的应用,包括不同方式控制器的实现与参数传递,以及SpringMVC实例应用的配置和代码实现。 首先,来看SpringMVC控制器的实现。SpringMVC支持多种控制器的实现方式。一种方式是通过...

Global site tag (gtag.js) - Google Analytics