1oNflow
V2EX  ›  Java

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

  •  
  •   1oNflow · Apr 30, 2020 · 4906 views
    This topic created in 2379 days ago, the information mentioned may be changed or developed.

    在使用 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 replies  •  2020-05-01 18:10:29 +08:00
    AS4694lAS4808
    AS4694lAS4808
    Apr 30, 2020
    1
    UserEntity...
    U7Q5tLAex2FI0o0g
    U7Q5tLAex2FI0o0g
    Apr 30, 2020
    2
    可以 import org.springframework.security.core.userdetails.User as xxx 吗

    php 是可以 use xx\xx\xx as yy,然后用的地方直接 yy
    jin7
    jin7
    Apr 30, 2020
    3
    MyUser 哈哈
    fgwmlhdkkkw
    fgwmlhdkkkw
    Apr 30, 2020
    4
    @littleylv oracle: 你可以提,但是我没必要改。
    hantsy
    hantsy
    Apr 30, 2020
    5
    @littleylv 好多语言可以这样,Java 还不行。
    hantsy
    hantsy
    Apr 30, 2020
    6
    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
    whypool
    Apr 30, 2020
    7
    不会改名?
    ezrealinxh
    ezrealinxh
    Apr 30, 2020
    9
    改成 Uesr
    adimn
    adimn
    Apr 30, 2020
    10
    创建一个内部类 SpringUser 类继承 spring 的 User
    1oNflow
    1oNflow
    OP
    Apr 30, 2020
    11
    @hantsy 感谢回复,学到了,这段代码我应该是之前从教程里学的,各种教程(可能时间久了)里用 java8 的不多,自己也没机会体验什么情况用 java8 更好...实际工作中会强制要求使用 java8 吗?
    hantsy
    hantsy
    Apr 30, 2020
    12
    @1oNflow 我个人玩一直跟最新版本。

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

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

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

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

    public class XXXService {

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

    }

    不过这样做的时候注意一下不会有副作用,比如 className 变了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2811 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 13:47 · PVG 21:47 · LAX 05:47 · JFK 08:47
    ♥ Do have faith in what you're doing.