springMVC自定義方法屬性解析器


使用場景例子:

用戶登陸系統一般會往Session里放置一個VO對象,然后在controller里會來獲取用戶的userId等信息。

之前的寫法是:@SessionAttributes配合@ModelAttribute來進行參數值的注入,但這樣需要寫2個注解,其中SessionAttributes加在類上,ModelAttribute加在方法的屬性上。

 

SpringMVC提供了HandlerMethodArgumentResolver接口來處理我們的自定義參數的解析。

例子:

1、獲取用戶信息的注解類

import java.lang.annotation.*;

/**
 * <p>綁定當前登錄的用戶</p>
 * <p>不同於@ModelAttribute</p>
 */
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser {

    /**
     * 當前用戶在request中的名字
     *
     * @return
     */
    String value() default "loginUser";

}

2、自定義的參數解析器

import com.gongren.cxht.pay.web.shiro.bind.annotation.CurrentUser;
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;

/**
 * <p>自定義方法參數解析器
 */
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {

    public CurrentUserMethodArgumentResolver() {
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        if (parameter.hasParameterAnnotation(CurrentUser.class)) {
            return true;
        }
        return false;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        CurrentUser currentUserAnnotation = parameter.getParameterAnnotation(CurrentUser.class);
        //從session的scope里取CurrentUser注解里的value屬性值的key的value
        return webRequest.getAttribute(currentUserAnnotation.value(), NativeWebRequest.SCOPE_SESSION);
    }
}

3、將自定義的解析器加入springmvc的配置文件里

<mvc:annotation-driven>
     <mvc:argument-resolvers>
        <!-- SESSION USER -->
        <bean class="com.test.CurrentUserMethodArgumentResolver"/>
    </mvc:argument-resolvers>
</mvc:annotation-driven>

在controller里的使用方法:

@RequestMapping(value = "/test")
public String test(@CurrentUser AccUserVo user) {
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM