You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data中字符串比较始终返回false问题求助

问题分析:PostgreSQL+Spring Data中字符串==比较返回false的原因及解决办法

核心问题

你在login()方法中用==比较两个字符串,这是在比较对象的引用地址,而非字符串的实际内容。从数据库查询返回的user.getUsername()是堆内存中新建的字符串实例,和请求传入的username实例不是同一个对象——哪怕内容完全一致,==也会返回false。

代码中的问题点

你的login()方法里这行代码是关键错误:

return (user.getUsername()==username);

解决办法

Java中比较字符串内容必须用equals()方法,以下是几种安全的写法:

  1. 直接调用equals()(注意:若user.getUsername()可能为null,会抛出空指针异常):
return user.getUsername().equals(username);
  1. 把传入的非空字符串放前面(避免空指针,因请求参数username是必填项,不会为null):
return username.equals(user.getUsername());
  1. 使用Objects.equals()(Java 7+支持,自动处理null情况):
import java.util.Objects;

// ...

public boolean login(String username, String password) {
    Useraccount user = userRepository.findByUsername(username).orElseThrow(() -> new IllegalStateException("User with Username "+username+" not found"));
    System.out.println(user.getUsername()+user.getPassword()+"out");
    System.out.println(username+password+"in");
    return Objects.equals(user.getUsername(), username);
}

额外提醒

实际生产环境中,绝对不能明文存储和比较密码。应该存储密码的哈希值(比如用BCrypt、Argon2等算法),登录时对传入的密码进行哈希后再和数据库中的哈希值比较,避免泄露风险。

内容的提问来源于stack exchange,提问作者Deonisos69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:05:31