SpringMVC ArgumentREsoler(方法参数解析器)

例:

先创建自定义注解

//
@Target(ElementType.PARAMETER)
//在运行时生效
//RetentionPolicy.RUNTIME 给方法使用
@Retention(RetentionPolicy.RUNTIME)

public @interface CurrentUser {
}

去定义自定义注解的规则

package com.lanou.demo.resolvers;

import com.lanou.demo.annotation.CurrentUser;
import com.lanou.demo.bean.UserBean;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
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.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Component
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {

    /*定义一个规则,
     *当前的参数解析器可以处理哪个Controller方法的哪个参数
     *返回是true  表示对这个参数进行处理
     * */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        //定义自己的规则
        //1.参数被@CurrentUser注解所标记
           CurrentUser currentUser
                  = parameter.getParameterAnnotation(CurrentUser.class);

        //2.参数类型为UserBean类型
        Class<?> clazz = parameter.getParameterType();

        return parameter.hasParameterAnnotation(CurrentUser.class)
                && UserBean.class == clazz;
    }

    /*如何为这个参数赋值
       这个方法的返回值会直接赋值给解析的参数
    */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        //获取请求
        HttpServletRequest req = webRequest.getNativeRequest(HttpServletRequest.class);
        //获取session
        HttpSession session = req.getSession();
        //把user存进session
        Object user = session.getAttribute("user");
        //返回
        return user;
    }
}

在xmlzhong把自定义注解配置上

把它改成开放标签
<mvc:annotation-driven/>

例:
 <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <!--配置的哪个类-->
            <ref bean="currentUserArgumentResolver"/>
        </mvc:argument-resolvers>
  </mvc:annotation-driven>

这样就可以使用自定义注解了

@RequestMapping("/insert1")
    @ResponseBody
    public String insert1(String name, String author, Float price,@CurrentUser UserBean user) {
        // 直接在方法的参数中添加形参, 参数名即为前端form中input的name属性
        System.out.println(name);
        System.out.println(author);
        System.out.println(price);
        return "insert1";
    }

原文地址:https://www.cnblogs.com/lxx-1843693653/p/10925379.html

时间: 2024-10-15 19:26:46

SpringMVC ArgumentREsoler(方法参数解析器)的相关文章

HandlerMethodArgumentResolver 参数解析器

关于springMvc中的参数解析器 springMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver(对参数的解析器) HandlerMethodArgumentResolver接口包含两个接口方法 1 boolean supportsParameter(MethodParameter parameter); MethodParameter方法参数对象 通过它可以获取该方法参数上的一些信息 如方法参数中的注解信息等 通过该方法我们如果需

SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 或许曾经的我们也见过一种方式http://localhost:8080/项目名/后台servlet?actionName=login&uname=admin&upwd=123 这种方式调度servlet并且传参数,这里我要表达什么呢?就是?后面可以拼接内容, 所以,此处的ParameterMethodNameResolver就是通过这种方式来访问到的方法名的 说一下案例使用步骤 一,定义Paramet

Spring MVC-控制器(Controller)-参数方法名称解析器(Parameter Method Name Resolver )示例(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_parametermethodnameresolver.htm 说明:示例基于Spring MVC 4.1.6. 以下示例显示如何使用Spring Web MVC框架使用多操作控制器的参数方法名称解析器方法.MultiActionController类有助于分别在单个控制器中将多个URL与其方法映射. package com.tutorialspoint; import java

SpringMVC处理器映射器和方法名称解析器

所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping HandlerMapping接口负责根据request请求找到对应的Handler处理器即Interceptor拦截器,并将它们封装在HandlerExecutionChain对象中,返回给中央调度器. 其常用的实现类有两种: 01BeanNameUrlHandlerMapping 02SimpleUr

SpringMVC自动封装List对象——自定义参数解析器

前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.List]: Specified class is an interface at org.springframework.beans.B

SSM-SpringMVC-10:SpringMVC中PropertiesMethodNameResolver属性方法名称解析器

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上次的以继承MultiActionController可以实现一个处理器中多个处理方法,但是局限出来了,他们的url访问地址只能是与方法名称相同的,因为他默认的方法名称解析器是InternalPathMethodNameResolver 如果我们想为了程序的安全甚至更多考虑(从url简洁啊,同名啊,等等)所以引入了一个叫PropertiesMethodNameResolver属性方法名称解析器的这个东西 我

SpringMVC——视图和视图解析器

请求处理方法执行完成后,最终返回一个 ModelAndView对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图 Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel.JFreeChart 等各种表现形式的视图 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并

Spring自定义argumentResolver参数解析器

在一个web程序中,当一个HTTP请求进来时,会被容器处理进而转换成一个servlet请求.http请求所携带的数据,虽然是格式化的但是无类型:而java作为强类型语言,同时为了健壮性考虑,必然要有完善的类型约束.当然,那么,将数据从servlet请求中转换到java中,一个很原始的方式是手动处理.幸好,Spring MVC通过以注解往函数添加额外信息的方式,使得上述的数据转换过程能够交由框架自动处理.从一个角度去看,Controller中的函数声明及注解定义了此HTTP请求的数据格式和类型,也

SpringMVC -- @ModelAttribute/视图,视图解析器/国际化

@ModelAttribute 这个注解注释比较多.. 我自己都有点看懵逼了... 还是在原来的例子上的Demo.... @ModelAttribute 和视图解析,以及国际化 我都写一起了,就不分开了.. package com.springmvc.handlers; import com.springmvc.model.User; import com.springmvc.model.User2; import org.springframework.stereotype.Controlle