在 Spring MVC 中,若需將 Session 中的用戶對象自動注入到 Controller 方法參數,可通過自定義 WebArgumentResolver 配合 AnnotationMethodHandlerAdapter 實現,避免在方法體中手動從 request 獲取。
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 類型,交由其他解析器處理
}
}
<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>
@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);
}
}
AnnotationMethodHandlerAdapter 在調用 Controller 方法前,遍歷 customArgumentResolver 列表resolveArgument 根據參數類型決定是否處理UserArgumentResolver 匹配 User.class,從 Session 取值返回HttpSession API,利於單元測試User,自動注入,無需重複代碼HandlerMethodArgumentResolver 替代 WebArgumentResolver(功能相似,API 更豐富)instanceof 判斷