首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring MVC 利用 AnnotationMethodHandlerAdapter 向 Controller 注入 Session 對象

     編輯:Java 相關知識

在 Spring MVC 中,若需將 Session 中的用戶對象自動注入到 Controller 方法參數,可通過自定義 WebArgumentResolver 配合 AnnotationMethodHandlerAdapter 實現,避免在方法體中手動從 request 獲取。

配置步驟

1. 實現 WebArgumentResolver

package com.greatwall.module.yhqxgl.interceptor;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebArgumentResolver;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import com.greatwall.module.yhqxgl.YhqxglConstants;
import com.greatwall.module.yhqxgl.domain.User;

public class UserArgumentResolver implements WebArgumentResolver {
    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
        // 目標參數類型為 User
        if (methodParameter.getParameterType().equals(User.class)) {
            // 從 Session 作用域獲取
            return webRequest.getAttribute(
                YhqxglConstants.GREATWALL_SESSION_USER,
                RequestAttributes.SCOPE_SESSION
            );
        }
        return UNRESOLVED; // 非 User 類型,交由其他解析器處理
    }
}

2. Spring MVC 配置文件註冊

<bean id="userArgumentResolver" 
      class="com.greatwall.module.yhqxgl.interceptor.UserArgumentResolver" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver">
        <ref bean="userArgumentResolver"/>
    </property>
</bean>

Controller 使用示例

@RequestMapping("/txn960204.do")
public void txn960204(HttpServletResponse response, 
                      HttpServletRequest req,
                      SysCodedata sysCodedata,
                      User user) {  // 直接聲明 User 參數,框架自動注入
    try {
        sysCodedata.setUpdateTime(DateUtils.currentDateTime());
        sysCodedata.setUpdateUsername(user.getUsername()); // 直接使用注入的 user
        sysCodedataService.updateOneSysCodedata(sysCodedata);
        JsonUtils.success("修改保存代碼明細表成功!", response);
    } catch (ServiceException e) {
        e.printStackTrace();
        JsonUtils.error(e, response);
    }
}

原理說明

  1. AnnotationMethodHandlerAdapter 在調用 Controller 方法前,遍歷 customArgumentResolver 列表
  2. 各 Resolver 的 resolveArgument 根據參數類型決定是否處理
  3. UserArgumentResolver 匹配 User.class,從 Session 取值返回
  4. 框架將返回值作為方法參數傳入

優勢與適用場景

  • 解耦:Controller 不依賴 HttpSession API,利於單元測試
  • 慣例優於配置:只要參數聲明為 User,自動注入,無需重複代碼
  • 適用:當前用戶、權限上下文、購物車等高頻 Session 對象

注意點

  • Spring 3.1+ 推薦使用 HandlerMethodArgumentResolver 替代 WebArgumentResolver(功能相似,API 更豐富)
  • Session 中對象不存在時返回 null,Controller 需做非空判斷或配合攔截器保證登錄態
  • 若有多類型 Session 對象需注入,可實現多個 Resolver 或在單 Resolver 中 instanceof 判斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved