Java 为什么我的jpa存储库返回一个对象,但是这个对象上的任何methodcall都会给出一个nullpointer异常?

Java 为什么我的jpa存储库返回一个对象,但是这个对象上的任何methodcall都会给出一个nullpointer异常?,java,spring-data,Java,Spring Data,我的帐户控制器中有此代码 Account account = accountRepository.findByUsername(username); 该参数来自接收字符串的RESTcontroller参数usernamehenk@gmail.com“。它包含“”的原因是,我在将其发送到控制器之前使用了javascript命令JSON.Stringify(username)。当您尝试对字符串进行字符串化时,它会额外添加一对“” 现在来回答我的问题。为什么带有此参数的account

我的帐户控制器中有此代码

        Account account = accountRepository.findByUsername(username);
该参数来自接收字符串的RESTcontroller参数usernamehenk@gmail.com“。它包含“”的原因是,我在将其发送到控制器之前使用了javascript命令JSON.Stringify(username)。当您尝试对字符串进行字符串化时,它会额外添加一对“”

现在来回答我的问题。为什么带有此参数的
accountRepository.findByUsername(username)
会返回一个帐户(我通过打印来检查:)

但是,当我调用该帐户上的任何方法(如toString())时,它会给出一个null指针异常?它与包含参数的“”对有关henk@gmail.com,但这为什么会导致jpa存储库返回这个神秘的account对象呢

jpa存储库的定义如下:

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
    Account findByUsername(String username);
    Account findByUsernameAndPassword(String username, String password);
    Set<Account> findByAdminIsTrue();
}
@存储库
公共接口AccountRepository扩展了JpaRepository{
帐户findByUsername(字符串用户名);
帐户findByUsernameAndPassword(字符串用户名、字符串密码);
设置findByAdminIsTrue();
}
帐户对象的定义如下:

@Entity
//@JsonIgnoreProperties
//@JsonIdentityInfo(
//        generator = ObjectIdGenerators.PropertyGenerator.class,
//        property = "id",
//        scope = Account.class)
public class Account implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String username;
    private String password;
    private String name;
    private boolean admin;
    private boolean enabled;
    private int remainingStatutoryLeaveHours = 240;
    private int remainingNonStatutoryLeaveHours = 60;

    @JsonIgnore
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL)
    List<LeaveQuery> leaveQueryList;
//

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "account", cascade = CascadeType.ALL)
    List<LaborPeriod> laborperiods = new ArrayList<>();

    @OneToOne
    private Person person;

    @Enumerated
    UserRole userRole = UserRole.USER;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public UserRole getUserRole() {
        return userRole;
    }

    public void setUserRole(UserRole userRole) {
        this.userRole = userRole;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public boolean isAdmin() {
        return admin;
    }

    public void setAdmin(boolean admin) {
        this.admin = admin;
    }

    public List<LaborPeriod> getLaborperiods() {
        return laborperiods;
    }

    public void setLaborperiods(List<LaborPeriod> laborperiods) {
        this.laborperiods = laborperiods;
    }

    public List<LeaveQuery> getLeaveQueryList() {
        return leaveQueryList;
    }

    public void setLeaveQueryList(List<LeaveQuery> leaveQueryList) {
        this.leaveQueryList = leaveQueryList;
    }

    public int getRemainingStatutoryLeaveHours() {
        return remainingStatutoryLeaveHours;
    }

    public void setRemainingStatutoryLeaveHours(int remainingStatutoryLeaveHours) {
        this.remainingStatutoryLeaveHours = remainingStatutoryLeaveHours;
    }

    public int getRemainingNonStatutoryLeaveHours() {
        return remainingNonStatutoryLeaveHours;
    }

    public void setRemainingNonStatutoryLeaveHours(int remainingNonStatutoryLeaveHours) {
        this.remainingNonStatutoryLeaveHours = remainingNonStatutoryLeaveHours;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", admin=" + admin +
                ", enabled=" + enabled +
                ", remainingStatutoryLeaveHours=" + remainingStatutoryLeaveHours +
                ", remainingNonStatutoryLeaveHours=" + remainingNonStatutoryLeaveHours +
                ", leaveQueryList=" + leaveQueryList +
                ", laborperiods=" + laborperiods +
                ", person=" + person +
                ", userRole=" + userRole +
                '}';
    }
}
@实体
//@JsonIgnoreProperties
//@JsonIdentityInfo(
//生成器=ObjectedGenerators.PropertyGenerator.class,
//property=“id”,
//scope=Account.class)
公共类帐户实现可序列化{
@身份证
@生成值
私人长id;
私有字符串用户名;
私有字符串密码;
私有字符串名称;
私有布尔管理;
启用私有布尔值;
私人整数剩余状态的小时数=240;
私有整数剩余非静态LeaveHours=60;
@杰索尼奥雷
@OneToMany(fetch=FetchType.EAGER,mappedBy=“account”,cascade=CascadeType.ALL)
列表查询列表;
//
@OneToMany(fetch=FetchType.LAZY,mappedBy=“account”,cascade=CascadeType.ALL)
List laborperiods=new ArrayList();
@奥内托内
私人;
@列举
UserRole UserRole=UserRole.USER;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公众人物{
返回人;
}
公众人士{
这个人=人;
}
公共用户角色getUserRole(){
返回用户角色;
}
public void setUserRole(UserRole UserRole){
this.userRole=userRole;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共布尔值isEnabled(){
返回启用;
}
已启用公共void集(已启用布尔值){
this.enabled=已启用;
}
公共布尔值isAdmin(){
返回管理员;
}
公共void setAdmin(布尔管理){
this.admin=admin;
}
公共列表getLaborperiods(){
返回周期;
}
公共作废setLaborperiods(列出laborperiods){
this.laboraperiods=laboraperiods;
}
公共列表getLeaveQueryList(){
返回查询列表;
}
public void setLeaveQueryList(列表leaveQueryList){
this.leaveQueryList=leaveQueryList;
}
公共整数GetRemainingStatutoryleAvehurs(){
返回剩余的状态数小时;
}
公共无效设置remainingStatutoryLeaveHours(整数remainingStatutoryLeaveHours){
this.remainingStatutoryLeaveHours=remainingStatutoryLeaveHours;
}
公共整数GetRemainingNonStatoryLeaveHours(){
返回剩余的非标准时间;
}
公共无效设置RemainingNonStatoryLeaveHours(整型RemainingNonStatoryLeaveHours){
this.remainingNonStatoryLeaveHours=remainingNonStatoryLeaveHours;
}
@凌驾
公共字符串toString(){
返回“帐户{”+
“id=”+id+
“,username='”+username+'\''+
,password=''+password+'\''+
“,name=”“+name+”\“””+
“,admin=“+admin”+
“,enabled=“+enabled”+
“,remainingStatutoryLeaveHours=“+remainingStatutoryLeaveHours+
“,remainingNonStatoryLeaveHours=“+remainingNonStatoryLeaveHours+
“,leaveQueryList=“+leaveQueryList+
“,laboraperiods=“+laboraperiods+
“,person=“+person+
“,userRole=“+userRole”+
'}';
}
}
有人有想法吗?

如果这句话:

    account.toString();
    System.out.println("Is account null? " + account == null);
是NPE的来源,那么只有一个合理的解释:
account
的值是
null


你说这句话:

    account.toString();
    System.out.println("Is account null? " + account == null);
正在告诉您,
帐户
不为空。猜猜看<不是

+
的优先级高于
=
。因此,上述陈述相当于:

    System.out.println(("Is account null? " + account) == null);
它将打印
false
,而不考虑
account
的值,因为将字符串与
null
串联将是非null字符串

使用以下语句重新运行程序:

    System.out.println("Is account null? " + (account == null));

然后你就能解决真正的问题。。。这就是为什么
account
null
以及如何处理它。

你确定你的
toString
方法没有抛出NPE吗?你声称调用
toString()
抛出NPE,但你没有向我们展示完整的堆栈跟踪。没有这一点,你的问题就无法回答。另外,在代码中标识抛出异常的行