spring - 让我的春季项目运行还有哪些其他可能的问题?
问题描述
我正在尝试启动我的 spring 项目并收到以下错误:
Error starting Tomcat context. Exception:
org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating
bean with name 'jwtRequestFilter': Unsatisfied dependency expressed through field
'userService'; nested exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with
name 'userService': Unsatisfied dependency expressed through field 'userRepository'; nested
exception is org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'userRepository': Cannot create inner bean '(inner bean)#cf199f9' of type
[org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property
'entityManager'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'(inner bean)#cf199f9': Cannot resolve reference to bean 'entityManagerFactory' while
setting constructor argument; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'entityManagerFactory' defined in class path resource
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation
of init method failed; nested exception is org.hibernate.service.spi.ServiceException:
Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
用户存储库:
package com.plearnit.website.config;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import com.plearnit.website.services.UserService;
import io.jsonwebtoken.ExpiredJwtException;
@Component
public class JwtRequestFilter extends OncePerRequestFilter {
@Autowired
private UserService userService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain)
throws ServletException, IOException {
final String requestTokenHeader = request.getHeader("Authorization");
String username = null;
String jwtToken = null;
// JWT Token is in the form "Bearer token". Remove Bearer word and get
// only the Token
if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
jwtToken = requestTokenHeader.substring(7);
try {
username = jwtTokenUtil.getUsernameFromToken(jwtToken);
} catch (IllegalArgumentException e) {
System.out.println("Unable to get JWT Token");
} catch (ExpiredJwtException e) {
System.out.println("JWT Token has expired");
}
} else {
logger.warn("JWT Token does not begin with Bearer String");
}
// Once we get the token validate it.
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null)
{
UserDetails userDetails = userService.loadUserByUsername(username);
// if token is valid configure Spring Security to manually set
// authentication
if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new
UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken
.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// After setting the Authentication in the context, we specify
// that the current user is authenticated. So it passes the
// Spring Security Configurations successfully.
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}
chain.doFilter(request, response);
}
}
用户服务:
package com.plearnit.website.services;
import java.util.ArrayList;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import com.plearnit.website.models.User;
import com.plearnit.website.config.JwtTokenUtil;
import com.plearnit.website.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder bcryptEncoder;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private HttpServletRequest request;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found with username: " + username);
}
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(),
new ArrayList<>());
}
public User save(User user) {
user.setPassword(bcryptEncoder.encode(user.getPassword()));
return userRepository.save(user);
}
public User loadCurrentUser(){
String token = request.getHeader("Authorization").replace("Bearer ", "");
return userRepository.findByUsername(jwtTokenUtil.getUsernameFromToken(token));
}
public Optional<User> findById (Integer id) {
return userRepository.findById(id);
}
}
用户存储库:
package com.plearnit.website.repositories;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.plearnit.website.models.User;
@Repository
public interface UserRepository extends CrudRepository<User, Integer> {
User findByUsername(String username);
}
用户:
package com.plearnit.website.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name = "user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String username;
@Column
@JsonIgnore
private String password;
@Column(updatable=false)
private Date createdAt;
private Date updatedAt;
@PrePersist
protected void onCreate(){
this.createdAt = new Date();
}
@PreUpdate
protected void onUpdate(){
this.updatedAt = new Date();
}
}
相关依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
我尝试过的事情:
- 确保 MySQL 正在运行
- 确认的 MySQL 凭据
- 将我的文件与我的 Github 存储库进行比较(无更改)
- 确保 pom.xml 中包含依赖项
- 将 Lombok @NoArgsConstructor 添加到用户模型
- 搜索 SO 2 小时
似乎这可能是我的项目之外的东西,但我无法弄清楚还有什么问题。
除了我目前看到的地方之外,我还能在哪里寻找这个错误的来源?
更新 -
事实证明,我在错误上滚动得不够多,以至于没有看到与 DB 上的时区相关的投诉。不知道为什么,但突然之间,经过几个月的工作,时区需要在数据库初始化字符串中指定。
解决方案
如果我没记错的话,Entity 应该有一个单独的空构造函数。还有一个带有数据的构造函数,它来自请求。
推荐阅读
- migration - 使用 Swift 将新类添加到现有已发布的 Realm 数据库中
- c# - WPF 在按钮单击时重新加载当前的 UserControl
- ibm-watson - 想在 IBM Watson 中创建新项目
- python - 数据框:值匹配条件的时间百分比
- r - 如何使用 R 中的正则表达式从字符串中提取文本?
- clojure - clojure:scheme 的 `set!` 的等价物是什么?
- regex - 从部分地址获取街道名称的最佳正则表达式
- c++ - 处理智能指针的错误
- protocol-buffers - 在 ESP-IDF 中使用 Google Protobuffers(C++)
- android - onActivityResult() 在我的代码中提供空数据以捕获图像并将其上传到 Firebase 存储