Неудовлетворенная зависимость, выраженная через поле ‘userTokenService’

#spring #spring-boot #spring-mvc #spring-security

#spring #spring-загрузка #spring-mvc #spring-безопасность

Вопрос:

homeControler

     package com.book.controller;

import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.book.entity.User;
import com.book.entity.security.UserToken;
import com.book.entity.security.service.SecurityService;
import com.book.entity.security.service.UserTokenService;

@Controller
public class HomeController {
    @Autowired
    private UserTokenService userTokenService;
    @Autowired
    private SecurityService securityService;

    @RequestMapping("/")
    public String getHome() {
        return "index";
    }

    @RequestMapping("/myaccount")
    public String myAccount() {
        return "myAccount";
    }

    @RequestMapping("/login")
    public String login(Model model) {
        model.addAttribute("classActiveLogin", true);
        return "myAccount";
    }

    @RequestMapping("/forgetPassword")
    public String forgetPassword(Model model) {
        model.addAttribute("classActiveForgetPassword", true);
        return "myAccount";
    }

    @RequestMapping("/newUser")
    public String newUser(Locale locale, @RequestParam("token") String token, Model model) {

        UserToken userToken = userTokenService.getPasswordResetToken(token);
        if (userToken == null) {
            String msg = "Invalid Token";
            model.addAttribute("msg", msg);
            return "redirect:/badRequest";
        }

        User user = userToken.getUser();
        String username = user.getUsername();

        UserDetails userDetails = securityService.loadUserByUsername(username);

        Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(),
                userDetails.getAuthorities());

        SecurityContextHolder.getContext().setAuthentication(authentication);

        model.addAttribute("classActiveEdit", true);
        return "myProfile";
    }
}
  

Пользовательский токен

 package com.book.entity.security;

import java.util.Calendar;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

import com.book.entity.User;

@Entity
public class UserToken {

    private static final int EXPIRATION = 60 * 24;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String token;

    @OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)
    @JoinColumn(nullable=false, name="user_id")
    private User user;

    private Date expiryDate;

    public UserToken(final String token, final User user) {
        super ();

        this.token = token;
        this.user = user;
        this.expiryDate = calculateExpiryDate(EXPIRATION);
    }

    private Date calculateExpiryDate (final int expiryTimeInMinutes) {
        final Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(new Date().getTime());
        cal.add(Calendar.MINUTE, expiryTimeInMinutes);
        return new Date(cal.getTime().getTime());
    }

    public void updateToken(final String token) {
        this.token = token;
        this.expiryDate = calculateExpiryDate(EXPIRATION);
    }

    @Override
    public String toString() {
        return "P_Token [id="   id   ", token="   token   ", user="   user   ", expiryDate="   expiryDate   "]";
    }

    public Long getId() {
        return id;
    }

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

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Date getExpiryDate() {
        return expiryDate;
    }

    public void setExpiryDate(Date expiryDate) {
        this.expiryDate = expiryDate;
    }

    public static int getExpiration() {
        return EXPIRATION;
    }



}
  

UserTokenService

 package com.book.entity.security.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.book.entity.User;
import com.book.entity.security.UserToken;
import com.book.entity.security.repo.PasswordResetRepo;
import com.book.entity.security.repo.UserTokenRepo;

@Service("userTokenService")
public class UserTokenService implements UserTokenRepo{

    @Autowired
    private PasswordResetRepo repo;

    @Override
    public UserToken getPasswordResetToken(final String token) {
        return repo.findByToken(token);
    }

    @Override
    public void createPasswordResetTokenForUser(final User user, final String token) {
        final UserToken myToken = new UserToken(token, user);
        repo.save(myToken);
    }
}
  

UserTokenRepo

 package com.book.entity.security.repo;

import com.book.entity.User;
import com.book.entity.security.UserToken;

public interface UserTokenRepo {

    UserToken getPasswordResetToken(final String token);

    void createPasswordResetTokenForUser(final User user, final String token);

}
  

SecurityService

 package com.book.entity.security.service;

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.stereotype.Service;
import com.book.entity.User;
import com.book.entity.security.repo.SecurityUserRepository;

@Service
public class SecurityService implements UserDetailsService {
    @Autowired
    private SecurityUserRepository securityUserRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = securityUserRepository.findByUsername(username);

        if (null == user) {
            throw new UsernameNotFoundException("Username not found");
        }

        return user;
    }
}
  

PasswordResetRepo

 package com.book.entity.security.repo;

import java.util.Date;
import java.util.stream.Stream;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import com.book.entity.User;
import com.book.entity.security.UserToken;


public interface PasswordResetRepo extends JpaRepository<UserToken, Long > {

    UserToken findByToken(String token);

    UserToken findByUser(User user);

    Stream<UserToken> findAllByExpiryDateLessThan(Date now);

    @Modifying
    @Query("delete from P_Token t where t.expirydate <= ?1")
    void deleteAllExpiredSince(Date now);
}
  

Ошибка:—>
org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘HomeController’: Неудовлетворенная зависимость, выраженная через поле ‘userTokenService’; вложенным исключением является org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘userTokenService’: Неудовлетворенная зависимость, выраженная через поле ‘repo’; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘passwordResetRepo’: не удалось вызвать метод init; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение antlr / RecognitionException

Комментарии:

1. Можете ли вы предоставить код для PasswordResetRepo? Помечено ли оно как компонент?

2. это интерфейс

Ответ №1:

Возможно, проблема кроется в HomeController приведенном ниже коде:

 @Autowired
    private UserTokenService userTokenService;
  

Замените этот код приведенным ниже кодом:

 @Autowired
        private UserTokenRepo userTokenService;
  

Ваша основная ошибка заключается в:

Неудовлетворенная зависимость, выраженная через поле ‘repo’; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘passwordResetRepo’: не удалось вызвать метод init; вложенным исключением является java.lang.Ошибка NoClassDefFoundError: исключение antlr / RecognitionException

Здесь не удалось создать компонент passwordResetRepo , потому что antlr/RecognitionException

Его решением является java.lang.Исключение ClassNotFoundException: antlr.Исключение RecognitionException показывает, что библиотека antlr отсутствует.

Добавьте его, и все готово 🙂

Вы можете попробовать добавить следующую зависимость. Это решит вашу проблему.

 <dependency>
 <groupId>org.antlr</groupId>
 <artifactId>antlr-complete</artifactId>
 <version>3.5.2</version>
</dependency>  
  

Другое возможное соображение:

Пожалуйста, проверьте все запросы JPA в PasswordResetRepo репозитории. Иногда, если запрос не соответствует имени переменной сущности, Spring не может создать компонент для этого репозитория

Надеюсь, это решит вашу проблему.

Спасибо 🙂

Ответ №2:

Взгляните на трассировку стека. Проблема в том, что контейнеру spring IoC не удается создать homeController компонент; потому что контейнеру не удается создать userTokenService компонент; и это потому, что контейнеру не удается создать passwordResetRepo компонент с java.lang.NoClassDefFoundError помощью.

Добавление следующего в ваш конфигурационный файл должно решить вашу проблему:

 <jpa:repositories base-package="com.book.entity.security.repo" />
  

Поскольку вы используете Spring Boot, пожалуйста, ознакомьтесь с этим руководством по доступу к данным с помощью JPA.

Из вышеупомянутого руководства:

По умолчанию Spring Boot включает JPA поддержку репозитория и просматривает пакет (и его подпакеты), где @SpringBootApplication находится. Если в вашей конфигурации есть JPA определения интерфейса репозитория, расположенные в невидимом пакете, вы можете указать альтернативные пакеты, используя @EnableJpaRepositories и его типобезопасный basePackageClasses=MyRepository.class параметр.

Комментарии:

1. сэр, но я использую spring Boot, и я полностью новичок в spring… пожалуйста, дайте мне ценные предложения. большое спасибо, сэр. пожалуйста, скажите мне, что такое файл confg в моем проекте?

2. @JahadulRakib, я обновил ответ в соответствии с вашим комментарием. Пожалуйста, взгляните.

3. большое спасибо, сэр … я запрашиваю вас в fb, когда вижу, что вы остаетесь в Дакке.