自定义的类名和 Spring 官方库的类重名了怎么办? - V2EX
1oNflow
V2EX    Java

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

  •  
  •   1oNflow Apr 30, 2020 4486 views
    This topic created in 2203 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     3199 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 66ms UTC 14:30 PVG 22:30 LAX 07:30 JFK 10:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86