首页 > 解决方案 > 让我的春季项目运行还有哪些其他可能的问题?

问题描述

我正在尝试启动我的 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>

我尝试过的事情:

似乎这可能是我的项目之外的东西,但我无法弄清楚还有什么问题。

除了我目前看到的地方之外,我还能在哪里寻找这个错误的来源?

更新 -

事实证明,我在错误上滚动得不够多,以至于没有看到与 DB 上的时区相关的投诉。不知道为什么,但突然之间,经过几个月的工作,时区需要在数据库初始化字符串中指定。

标签: spring

解决方案


如果我没记错的话,Entity 应该有一个单独的空构造函数。还有一个带有数据的构造函数,它来自请求。


推荐阅读