V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1oNflow
V2EX  ›  Java

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

  •  
  •   1oNflow · 2020-04-30 14:28:53 +08:00 · 3829 次点击
    这是一个创建于 1660 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在使用 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);
            }
        }
    
    20 条回复    2020-05-01 18:10:29 +08:00
    AS4694lAS4808
        1
    AS4694lAS4808  
       2020-04-30 14:33:06 +08:00
    UserEntity...
    littleylv
        2
    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
        3
    jin7  
       2020-04-30 14:53:23 +08:00
    MyUser 哈哈
    fgwmlhdkkkw
        4
    fgwmlhdkkkw  
       2020-04-30 14:55:47 +08:00
    @littleylv oracle: 你可以提,但是我没必要改。
    hantsy
        5
    hantsy  
       2020-04-30 14:57:24 +08:00
    @littleylv 好多语言可以这样,Java 还不行。
    hantsy
        6
    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
        7
    whypool  
       2020-04-30 15:03:01 +08:00
    不会改名?
    hantsy
        8
    hantsy  
       2020-04-30 15:05:51 +08:00
    Lin0936
        9
    Lin0936  
       2020-04-30 15:05:57 +08:00
    改成 Uesr
    ma836323493
        10
    ma836323493  
       2020-04-30 15:45:07 +08:00
    创建一个内部类 SpringUser 类继承 spring 的 User
    1oNflow
        11
    1oNflow  
    OP
       2020-04-30 16:54:16 +08:00
    @hantsy 感谢回复,学到了,这段代码我应该是之前从教程里学的,各种教程(可能时间久了)里用 java8 的不多,自己也没机会体验什么情况用 java8 更好...实际工作中会强制要求使用 java8 吗?
    hantsy
        12
    hantsy  
       2020-04-30 18:38:32 +08:00
    @1oNflow 我个人玩一直跟最新版本。

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

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

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

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

    public class XXXService {

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

    }

    不过这样做的时候注意一下不会有副作用,比如 className 变了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:00 · PVG 09:00 · LAX 17:00 · JFK 20:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.