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,但你没有向我们展示完整的堆栈跟踪。没有这一点,你的问题就无法回答。另外,在代码中标识抛出异常的行