Springbootカスタムパラメータ注記LoginUser


パラメータ注記を使用してログインユーザーを取得し、コードをより優雅にします.
1、カスタム注釈は解析器HandlerMethodArgumentResolverを実現し、二つの方法を実現する必要がある.
@Component
@Slf4j
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Autowired
	private LoginService loginService;
    
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(User.class) && parameter.hasParameterAnnotation(LoginUser.class);
    }
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
        	Long cUserId=(Long) request.getAttribute(Constants.CURRENT_USER_ID,RequestAttributes.SCOPE_REQUEST);
        	 if (cUserId>0) {
        	      //          
                  User user = loginService.getUserById(cUserId);
                  if(user == null) {
        	          throw new RuntimeException(i18nService.getMessage("user.not.exist"));
                  }
                  return user;
        	 }
     }
}

2、Userの実体クラスを設定する
@Data
public class User extends BaseObject {
	private Integer id;
	private String username;
	private String mobile;
}

3、カスタム注釈LoginUser、Targetを設定して注釈の作用目標範囲を方法パラメータとし、Retentionを設定して注釈の有効範囲を(注釈はclassファイルに保存されるだけでなく、jvmがclassファイルをロードした後も、依然として存在する)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}

4、方法で直接注釈でログインユーザー情報を使用する
    @PostMapping("saveServiceInfo")
    public ResponseResult saveServiceInfo(@LoginUser User loginUser) {
        //       LoginUser         
        loginUser.getUsername();
    }

5、パラメータの注釈が完成したので、コードが優雅に見えたのではないでしょうか.