1oNflow
V2EX  ›  Java

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

  •  
  •   1oNflow · Apr 30, 2020 · 4504 views
    This topic created in 2211 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
        1
    AS4694lAS4808  
       Apr 30, 2020
    UserEntity...
    U7Q5tLAex2FI0o0g
        2
    U7Q5tLAex2FI0o0g  
       Apr 30, 2020
    可以 import org.springframework.security.core.userdetails.User as xxx 吗

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

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

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

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

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

    public class XXXService {

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

    }

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