Vaadin BeanCreationException:在尝试调用我的服务类的保存方法时

问题描述 投票:0回答:1

嗨,我有一个Vaadin小项目。在这里,我有一个UserUtils.class,它具有一个createNewUser方法,如下所示:

LoginView:

import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.login.LoginForm;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.BeforeEnterEvent;
import com.vaadin.flow.router.BeforeEnterObserver;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.Collections;

import static com.packagename.utils.UserUtils.createNewUser;

@Route("login")
@PageTitle("Login - packagename")

public class LoginView extends VerticalLayout implements BeforeEnterObserver {

    private LoginForm login = new LoginForm();
    private PasswordEncoder passwordEncoder;

    public LoginView(){
        createNewUser("daniel.tran", "cAWFCMaa22", true, "ADMIN");
        addClassName("login-view");
        setSizeFull();
        setAlignItems(Alignment.CENTER);
        setJustifyContentMode(JustifyContentMode.CENTER);

        login.setAction("login");

        add(
                new H1("Willkommen!"),
                login
        );
    }

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        // Inform the user about an authentication error
        if (!event.getLocation()
                .getQueryParameters()
                .getParameters()
                .getOrDefault("error", Collections.emptyList())
                .isEmpty()) {
            login.setError(true);
        }
    }
}

UserUtils.class:

import com.packagename.backend.entity.UserEntity;
import com.packagename.backend.service.UserService;
import com.packagename.security.SecurityConfiguration;
import com.packagename.ui.views.login.LoginView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;

public class UserUtils {

    @Autowired
    private LoginView loginView;
    private static UserService userService;
    private PasswordEncoder passwordEncoder;

    public static void createNewUser(String pUsername, String pPassword, boolean pStatus, String pRole) {

        if (!UserUtils.userExists(pUsername)) {
            userService = new UserService();
            PasswordEncoder passwordEncoder = SecurityConfiguration.passwordEncoder();
            String encodedPassword = passwordEncoder.encode(pPassword);
            UserEntity user = new UserEntity();
            user.setUserName(pUsername);
            user.setPassword(encodedPassword);
            user.setStatus(pStatus);
            user.setRoles(pRole);
            userService.save(user);
        }
    }

    private static boolean userExists(String pUsername) {
        userService = new UserService();
        UserEntity user = new UserEntity();
        user.setUserName(pUsername);
        boolean exists = userService.exists(user);
        return exists;
    }
}

UserService.class:

import com.packagename.backend.entity.UserEntity;
import com.packagename.backend.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

@Service
public class UserService {

    private UserRepository userRepository;
    private Logger LOGGER;

    @Autowired
    public UserService(UserRepository pUserRepository) {
        this.userRepository = pUserRepository;
    }

    public UserService() {}

    public List<UserEntity> findAll() {
        return userRepository.findAll();
    }

    public long count() {
        return userRepository.count();
    }

    public void delete(UserEntity user) {
        userRepository.delete(user);
    }

    public void save(UserEntity user) {
        if (user == null) {
            LOGGER.log(Level.SEVERE, "Contact is null. Are you sure you have connected your form to the application?");
            return;
        }
        userRepository.save(user);
    }

    public boolean exists(UserEntity user) {
        Example<UserEntity> example = Example.of(user);
        boolean exists = userRepository.exists(example);
        return exists;
    }
}

UserEntity.class:

import javax.persistence.*;

@Entity
@Table(name = "PSYS_USERS")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int userid;
    private String userName;
    private String password;
    private boolean status;
    private String roles;

    public UserEntity(){}

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    public String getRoles() {
        return roles;
    }

    public void setRoles(String roles) {
        this.roles = roles;
    }
}

UserRepository.class

import com.packagename.backend.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<UserEntity, Integer> {
    Optional<UserEntity> findByUserName(String userName);
}

并且总是涉及到情景时,尝试调用userService方法,然后它会引发以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.packagename.ui.views.login.LoginView': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.packagename.ui.views.login.LoginView]: Constructor threw exception; nested exception is java.lang.NullPointerException

我试图在实体以及服务类上创建一个默认的构造函数,但没有什么需要帮助。

到目前为止,丹尼尔

spring-boot authentication spring-data-jpa password-encryption vaadin14
1个回答
0
投票

new UserService();-这是问题。

您无法自行实例化弹簧组件,必须让弹簧注入/自动装配它们。可以注入Spring组件的地方就是spring组件本身,并且使用Vaadin,您可以注入带有@Route批注的视图。 LoginView是这样的视图。因此,您在其中注入了UserService,并将其传递给createNewUser方法。

// LoginView constructor
// userService is injected/autowired this way
public LoginView(UserService userService){
    createNewUser("daniel.tran", "cAWFCMaa22", true, "ADMIN", userService);
    addClassName("login-view");
    setSizeFull();
    setAlignItems(Alignment.CENTER);
    setJustifyContentMode(JustifyContentMode.CENTER);

    login.setAction("login");

    add(
            new H1("Willkommen!"),
            login
    );
}

// UserUtils
public static void createNewUser(String pUsername, String pPassword, boolean pStatus, String pRole, UserService userService) {
    if (!UserUtils.userExists(pUsername, userService)) {
        PasswordEncoder passwordEncoder = SecurityConfiguration.passwordEncoder();
        String encodedPassword = passwordEncoder.encode(pPassword);
        UserEntity user = new UserEntity();
        user.setUserName(pUsername);
        user.setPassword(encodedPassword);
        user.setStatus(pStatus);
        user.setRoles(pRole);
        userService.save(user);
    }
}

private static boolean userExists(String pUsername, UserService userService) {
    UserEntity user = new UserEntity();
    user.setUserName(pUsername);
    boolean exists = userService.exists(user);
    return exists;
}

顺便说一句,UserUtils不是Spring Component,所以您也不能在其中自动连接loginView-好在它始终没有使用]]

© www.soinside.com 2019 - 2024. All rights reserved.