【问题标题】:Cannot resolve method on java object无法解析 java 对象上的方法
【发布时间】:2021-04-23 02:35:15
【问题描述】:

我正在用 java 尝试一些新的设计模式,但我对为什么我的不起作用感到困惑。

我的目标是将用户帐户传递给数据传输对象,然后可以通过检查新用户是否存在以及如果不使用 getter 和 setter 来注册新用户并将其保存到一个带有映射器的 mongoDB 数据库。

这一切似乎都很顺利,直到我在我的服务实现和映射器中的 setpassword 上得到一个未解决的方法调用,我不知道为什么。 我通过在我的用户帐户中扩展一个基本用户来获取我的 setFirstname,该用户帐户上有一个名字字段。

任何帮助都会很棒:)

package com.datingapp.model.user;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "userAccounts")
public class UserAccount extends User {
    @Id
    private String id;
    private String email;
    private String password;
    private String lastname;
    private String phoneNumber;

    public UserAccount() {}

    public String getId() {
        return id;
    }

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

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

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

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
package com.datingapp.dto.model.user;

import com.datingapp.model.user.User;
import com.datingapp.model.user.UserAccount;

public class UserAccountDto extends User {
    private String email;
    private String lastname;
    private String password;
    private String phoneNumber;

    public UserAccountDto() {
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

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

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

}
package com.datingapp.dto.mapper;

import com.datingapp.dto.model.user.UserAccountDto;
import com.datingapp.model.user.UserAccount;
import org.springframework.stereotype.Component;

@Component
public class UserAccountMapper {

    public static UserAccountDto toUserAccountDto(UserAccount userAccount) {
        return new UserAccountDto()
                .setEmail(userAccount.getEmail())
                .setFirstname(userAccount.getFirstname())
                .setLastname(userAccount.getLastname())
                .setPassword(userAccount.getPassword())
                .setPhoneNumber(userAccount.getPhoneNumber());
    }
}
package com.datingapp.service.user;

import com.datingapp.dto.mapper.UserAccountMapper;
import com.datingapp.dto.model.user.UserAccountDto;
import com.datingapp.model.user.UserAccount;
import com.datingapp.repository.user.UserAccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

@Component
public class UserAccountImpl implements UserAccountService {
    private UserAccountRepository userAccountRepository;
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    public UserAccountImpl(UserAccountRepository userAccountRepository, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userAccountRepository = userAccountRepository;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @Override
    public UserAccountDto signup(UserAccountDto userDto) {
        UserAccount user = userAccountRepository.findByEmail(userDto.getEmail());
        if (user == null) {
            user = new UserAccount()
                    .setEmail(userDto.getEmail())
                    .setPassword(bCryptPasswordEncoder.encode(userDto.getPassword()))
                    .setFirstName(userDto.getFirstname())
                    .setLastName(userDto.getFirstname())
                    .setMobileNumber(userDto.getPhoneNumber());
            return UserAccountMapper.toUserAccountDto(userAccountRepository.save(user));
        }
    }
}
package com.datingapp.service.user;

import com.datingapp.dto.model.user.UserAccountDto;
import com.datingapp.model.user.UserAccount;

public interface UserAccountService {
    UserAccountDto signup(UserAccountDto userAccountDto);
}

【问题讨论】:

    标签: java spring mongodb dto mapper


    【解决方案1】:

    我知道毕达古斯已经回答了你的问题,但让我给你一个提示。 尝试使用Lombok。 Lombok 是一个 java 库,可以帮助您避免样板代码。例如,使用 @Data 注释,您告诉 Lombok 在后台创建所有 getter 和 setter。对你有很大帮助。

    【讨论】:

      【解决方案2】:

      你的 setter 是 void 方法,也就是说它们什么都不返回。

      您将通过以下方式获得预期结果:

      public UserAccountDto setEmail(String email) {
           this.email = email;
      
           return this ;
      }
      

      你必须在你的设置器中添加return this

      【讨论】:

      • 所以在我的 dto 中有一种 userAccountDto 并为每个 setter 返回这个,在我的 userAccount 中有一种 userAccount 并为每个返回这个?
      • 是的,你需要。我建议您将这些设置器放在User 类中以一劳永逸地定义它们。你所有的二传手都应该返回this
      猜你喜欢
      • 2016-01-15
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      相关资源
      最近更新 更多