JPARepository findByUserName 方法 returns 空值

JPARepository findByUserName method returns null values

我想使用 Spring 安全性来获取当前登录的用户对象,但它 returns 是一个空值。我从存储库中实现了 findByUsername 方法进行测试,但它返回 null/empty 值,并且我已确保数据在数据库中。我可能做错了什么?

实体class

public class User {

    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String firstName ;
    private String lastName;
    @Column(name="user_name", unique=true)
    private String userName;
    private String password;
    private String Gender; 

存储库class

@Repository
public interface UserAccountRepository extends JpaRepository <User, Long>  {
    
     Optional<User> findById(Long id);

     User findByUserName(String username);

服务class

@Transactional
@Service
public class UserAccountService implements UserDetailsService {

        @Autowired  
        private UserAccountRepository userRepository;
        
        private PasswordEncoder bCryptPasswordEncoder;
     
        public User findByUserName(String username) 
        {
        return userRepository.findByUserName(username);
        }

控制器class

     @GetMapping(value="/user/{username}")
        public User findByUsername(String username) {
          System.out.println("Username :" + username);
          return userAccountService.findByUserName(username);
            
        }

应用程序属性

spring.datasource.url=jdbc:mysql://localhost:3306/investmentpartners
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username= root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

spring.main.allow-bean-definition-overriding=true

spring.servlet.multipart.max-file-size=3000KB
spring.servlet.multipart.max-request-size=3000KB
spring.http.multipart.enabled=false

将 spring.jpa.show-sql=true 添加到 application.properties 文件后,这里是生成的查询

Hibernate: select user0_.id as id1_4_, user0_.gender as gender2_4_, user0_.branch_id as branch_11_4_, user0_.created_date as created_3_4_, user0_.email as email4_4_, user0_.first_name as first_na5_4_, user0_.last_name as last_nam6_4_, user0_.password as password7_4_, user0_.phone_number as phone_nu8_4_, user0_.status as status9_4_, user0_.user_name as user_na10_4_ from user user0_ where user0_.user_name is null
null

您忘记用注释标记您的路径变量。

解决方案:

@PathVariable String username

控制器class

@GetMapping(value="/user/{username}")
public User findByUsername(@PathVariable String username) {
   System.out.println("Username :" + username);
   return userAccountService.findByUserName(username);
}

注:

不要在您的代码中使用 System.out.println 来注销某些内容,尤其是当您使用 Spring 并且您的代码在服务器 (Tomcat) 中运行时。 Spring 提供了一种完美、易于使用的方式来编写要记录的内容:

public class YourController {

    Logger logger = LoggerFactory.getLogger(YourController .class);

    @GetMapping(...)
    public String index(...) {
        logger.debug("A DEBUG Message");
        logger.info("An INFO Message");
        // ...
    }
}