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");
// ...
}
}
我想使用 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");
// ...
}
}