用自定义注解,给参数赋值

业务场景:
之前系统中页面上选择的站点默认的是全部的,现在要增加权限功能,只有用户有权限的站点才显示到页面上。为了最小限度的修改代码,决定用注解的方式对站点参数统一整理后再赋值

主要用到的是SpringMvc的HandlerMethodArgumentResolver接口和自定义注解类

1.创建自定义注解:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SiteAuthority {

}

2.实现HandlerMethodArgumentResolver接口

public class SiteAuthorityHandlerMethodArgumentResolver  implements HandlerMethodArgumentResolver{
	
	@Autowired
	AuthorityService authorityService;
	
	@Value("${authorityControlSwitch}")
	private String authorityControlSwitch;

	/* (non-Javadoc)
	 * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#supportsParameter(org.springframework.core.MethodParameter)
	 */
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		// TODO Auto-generated method stub
		if (parameter.hasParameterAnnotation(SiteAuthority.class)) {
            return true;
        }
        return false;
	}

	/* (non-Javadoc)
	 * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory)
	 */
	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
		// 先获取系统中的所有站点
		List<MtSite> allSiteList = MtSiteManager.getInstance().getSites();
		//在判断权限控制开关,如果开启,则先获取有权限的站点,然后返回给参数
		if(AuthorityControlSwitch.OPEN.getKey().equals(authorityControlSwitch)){
			Map<String, MtSite> allSiteMap = new HashMap<String, MtSite>();
			for (MtSite mtSite : allSiteList) {
				allSiteMap.put(mtSite.getCode(), mtSite);
			}

			//HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
			UurSessionEntity systemUser = (UurSessionEntity) SystemUserLoacl.getSystemUser();
			List<String> sitCodeList= authorityService.getSiteCodeAuthorityByUser(systemUser.getUserName());
			List<MtSite> authoritySites = new ArrayList<MtSite>();
			for (String siteCode : sitCodeList) {
				MtSite mtSite= allSiteMap.get(siteCode);
				if (null != mtSite) {
					authoritySites.add(mtSite);
				}
			}
			return authoritySites;
		}
		return allSiteList;
	}

}

3.再xml里进行配置

<mvc:annotation-driven>
	    <mvc:argument-resolvers>
            <bean class="com.cas.platform.web.common.interceptor.SiteAuthorityHandlerMethodArgumentResolver"></bean>
        </mvc:argument-resolvers>
</mvc:annotation-driven>

4controller层对站点参数代码进行改造

改造之前:

public String showCalendarAnalysisPage(Model model) {
		// 这种方式获取的全部站点,没有使用权限
		List<MtSite> siteList = MtSiteManager.getInstance().getSites();
		}

改造之后:

//把参数放在入参,同时加上自定义注解,通过SiteAuthorityHandlerMethodArgumentResolver 类,对所有站点数据进行处理,从而实现权限的增加
public String showCalendarAnalysisPage(Model model,@SiteAuthority List<MtSite> siteList){
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和中的内容,自定义注解是通过使用关键字@interface进行声明的。在声明注解时,可以使用@Target注解来指定注解使用范围,例如ElementType.METHOD表示注解可以应用于方法上。同时,使用@Retention注解来指定注解的保留策略,例如RetentionPolicy.RUNTIME表示注解在运行时仍然可用。自定义注解可以包含自定义的成员变量,可以为这些成员变量设置默认值。在使用注解时,可以通过在目标代码上添加注解,并为注解的成员变量赋值来判断参数是否是所需的。所以,可以通过判断注解的成员变量值是否符合预期来验证参数是否是所需的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JAVA——通过自定义注解实现每次程序启动时,自动扫描被注解的方法,获取其路径及访问该路径所需的权限并...](https://blog.csdn.net/weixin_56039103/article/details/126957545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Java 自定义注解](https://blog.csdn.net/Amme12123/article/details/130536041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值