Springbootカスタムパラメータ注記LoginUser
1856 ワード
パラメータ注記を使用してログインユーザーを取得し、コードをより優雅にします.
1、カスタム注釈は解析器HandlerMethodArgumentResolverを実現し、二つの方法を実現する必要がある.
2、Userの実体クラスを設定する
3、カスタム注釈LoginUser、Targetを設定して注釈の作用目標範囲を方法パラメータとし、Retentionを設定して注釈の有効範囲を(注釈はclassファイルに保存されるだけでなく、jvmがclassファイルをロードした後も、依然として存在する)
4、方法で直接注釈でログインユーザー情報を使用する
5、パラメータの注釈が完成したので、コードが優雅に見えたのではないでしょうか.
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、パラメータの注釈が完成したので、コードが優雅に見えたのではないでしょうか.