Vaadin BeanCreationException: при попытке вызвать метод сохранения моего класса обслуживания - PullRequest
0 голосов
/ 31 марта 2020

Привет, у меня есть маленький проект 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

Я пытался создать конструктор по умолчанию на объекте, а также на классе обслуживания, но ничего не нужно, чтобы помочь.

Пока что Даниил

1 Ответ

0 голосов
/ 02 апреля 2020

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, поэтому вы также не можете автоматически подключить loginView - хорошо, что это все равно не используется

...