Неудовлетворенная зависимость выражается через поле 'userTokenService' - PullRequest
0 голосов
/ 12 марта 2019

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);
    }
}

1018 * 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: ошибка при создании bean-компонента с именем 'userTokenService': неудовлетворительная зависимость, выраженная через поле 'repo'; вложенное исключение: org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'passwordResetRepo': сбой вызова метода init; вложенным исключением является java.lang.NoClassDefFoundError: antlr / RecognitionException

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Может быть проблема лежит на 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 lib отсутствует .

Добавьте это и все готово :)

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

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

Еще одно возможное соображение:

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

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

Спасибо :))

0 голосов
/ 13 марта 2019

Посмотрите на трассировку стека.Проблема в том, что контейнеру Spring IoC не удается создать компонент homeController;потому что контейнер не может создать userTokenService bean;и это потому, что контейнер не может создать passwordResetRepo bean-компонент с java.lang.NoClassDefFoundError.

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...