自定义的类名和 Spring 官方库的类重名了怎么办?

2020-04-30 14:28:53 +08:00
 1oNflow

在使用 Spring Security 时遇到一个问题,我自己定义了 User 的 POJO,UserDetail 是用的官方的,然后官方的一个类名也叫 User,所以只能在这里把官方的全名写出来,就是很长,有没有更优雅的方法来解决?

或许只能给自己的类改名?但是还有比 User 更清楚明确的名字吗...

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        } else {
            Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
            for (Role role : user.getRoles()) {
                grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
            }
            return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities);
        }
    }
3713 次点击
所在节点    Java
20 条回复
AS4694lAS4808
2020-04-30 14:33:06 +08:00
UserEntity...
littleylv
2020-04-30 14:42:01 +08:00
可以 import org.springframework.security.core.userdetails.User as xxx 吗

php 是可以 use xx\xx\xx as yy,然后用的地方直接 yy
jin7
2020-04-30 14:53:23 +08:00
MyUser 哈哈
fgwmlhdkkkw
2020-04-30 14:55:47 +08:00
@littleylv oracle: 你可以提,但是我没必要改。
hantsy
2020-04-30 14:57:24 +08:00
@littleylv 好多语言可以这样,Java 还不行。
hantsy
2020-04-30 15:01:30 +08:00
1 。 自己的 User 可以实现 UserDetails 接口,省事一点。
2 。 然后 UserDetailsService, 一行代码解决。
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return this.users.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("Username: " + username + " not found"));
}
whypool
2020-04-30 15:03:01 +08:00
不会改名?
hantsy
2020-04-30 15:05:51 +08:00
Lin0936
2020-04-30 15:05:57 +08:00
改成 Uesr
ma836323493
2020-04-30 15:45:07 +08:00
创建一个内部类 SpringUser 类继承 spring 的 User
1oNflow
2020-04-30 16:54:16 +08:00
@hantsy 感谢回复,学到了,这段代码我应该是之前从教程里学的,各种教程(可能时间久了)里用 java8 的不多,自己也没机会体验什么情况用 java8 更好...实际工作中会强制要求使用 java8 吗?
hantsy
2020-04-30 18:38:32 +08:00
@1oNflow 我个人玩一直跟最新版本。

项目中早就用 Java 11 了,很多开源框架慢慢会把 Java 8 作为可选的,Java 11 为主要的支持版本了,如 Quarkus 计划在 1.6 中删除 Java 8 支持。
1oNflow
2020-04-30 20:30:49 +08:00
@hantsy 了解。

另外能问下你在当 findByUsername 没有这个用户名时选择抛出了异常,但是我还有一个用户注册功能,并且对表单数据进行了后端 validation,其中有一项是判断数据库是否已经存在相同的用户名,在这种情况下,我也要调用 findByUsername 去看有没有这个用户,如果存在就返回校验失败。

所以此时抛出异常(此前不存在同名用户)恰恰是“正常”的情况无须处理,所以使用 try catch 感觉处理比较棘手,反而我最开始的返回 null 的方案比较好办。

想问下什么场合要抛出异常,我描述的这个情景使用异常有比较好的解决方案吗?
hantsy
2020-04-30 20:43:58 +08:00
enrio
2020-04-30 21:09:34 +08:00
我记得有个人说过,编程不要用 User 这个词。
1oNflow
2020-04-30 22:01:29 +08:00
@hantsy 非常感谢,明白了。
jwenjian
2020-05-01 09:19:48 +08:00
My***
jwenjian
2020-05-01 09:21:38 +08:00
@1oNflow 存在不存在 可以用 countByUsername 判断返回数量,也可以用 exists 返回一个 boolean 值。
AAASUKA
2020-05-01 09:51:47 +08:00
所有自定义类写成 Myxxxx
daozhihun
2020-05-01 18:10:29 +08:00
java 不能 import as,如果你遇到了这个情况,除了写全包名,还可以考虑一个子类的实现。比如

public class XXXService {

// Spring 自己的 User
private static class SystemUserEntity extends UserDetails { }

}

不过这样做的时候注意一下不会有副作用,比如 className 变了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667620

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX