Login not working in spring boot project. [nio-8787-exec-6] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [] error

Viewed 21

I have been working on a spring boot project using database MySQL on macOS using netbeans and eclipse IDE. I am new to this tech-stack and have been trying to resolve the login error. On trying to login after successfully registering, I am getting the error message that Invalid username or password despite entering valid details from the table.

The UserLogin.html file:

<div class="form-center">
            <div class="center">
                <h1>Login</h1>
                <form th:action="@{/UserLogin}" method="post" >
                    <!-- error message -->
                    <div th:if="${param.error}">
                        <div class="alert alert-danger">Invalid username or password.</div>
                    </div>

                    <!-- logout message -->
                    <div th:if="${param.logout}">
                        <div class="alert alert-info">You have been logged out.</div>
                    </div>
                    
                    <div class="txt_field">
                        <input type="text" required>
                        <span></span>
                        <label>Email ID</label>
                    </div>
                    <div class="txt_field">
                        <input type="password" required>
                        <span></span>
                        <label>Password</label>
                    </div>
                    <div class="pass"><a href="/" th:href="@{/forgotPasswordUser}">Forgot Password?</a></div>
                    <input type="submit" value="Login">
                    <div class="signup_link">
                        Not a member? <a href="/" th:href="@{/registration}">Sign-Up</a>
                    </div>
                </form>
            </div>
        </div>

The UserRepository.java code:

package net.cdac.TMS.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import net.cdac.TMS.model.User;

@Repository
public interface UserRepository extends JpaRepository<User, String>{
    @Query("SELECT u FROM User u WHERE u.uemailid = ?1")
    User findByUemailid(String uemailid);
}

The User.java file:

package net.cdac.TMS.model;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;

import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.JoinColumn;

@Entity
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = "uemailid"))
public class User implements Serializable{

    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
    @Column(name = "uemailid", unique=true)
    private String uemailid;
    
    @Column(name = "uname")
    private String uName;

    private String upassword;

    private String usecurityQ;

    private String usecurityA;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "users_roles",
    joinColumns = @JoinColumn( name = "user_id", referencedColumnName = "id"),
    inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    
    private List<Role> roles;
    public User() {

    }
    public User(String email, String password) {

    }

    public User(String Name, String email, String password, String securityQ, String securityA, List<Role> roles) {
        super();
        this.uName = Name;
        this.uemailid = email;
        this.upassword = password;
        this.usecurityQ = securityQ;
        this.usecurityA = securityA;
        this.roles = roles;
    }

    public String getUemailid() {
        return uemailid;
    }

    public void setUemailid(String uemailid) {
        this.uemailid = uemailid;
    }
    
    public String getuName() {
        return uName;
    }

    public void setuName(String uName) {
        this.uName = uName;
    }

    public String getUpassword() {
        return upassword;
    }

    public void setUpassword(String upassword) {
        this.upassword = upassword;
    }

    public String getUsecurityQ() {
        return usecurityQ;
    }

    public void setUsecurityQ(String usecurityQ) {
        this.usecurityQ = usecurityQ;
    }

    public String getUsecurityA() {
        return usecurityA;
    }

    public void setUsecurityA(String usecurityA) {
        this.usecurityA = usecurityA;
    }
    public List<Role> getRoles() {
        return roles;
    }
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

}

The UserServiceImpl.java :

package net.cdac.TMS.service;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import net.cdac.TMS.model.Role;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import net.cdac.TMS.model.User;
import net.cdac.TMS.repository.RoleRepository;
import net.cdac.TMS.repository.UserRepository;
import net.cdac.TMS.web.dto.UserRegistrationDto;

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private RoleRepository roleRepository;
    
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    public UserServiceImpl(UserRepository userRepository) {
        super();
        this.userRepository = userRepository;
    }

    @Override
    public User save(UserRegistrationDto registrationDto) {
        Role urole = new Role("ROLE_USER");
        Role uroles = roleRepository.save(urole);
        
        User user = new User(registrationDto.getuName(),registrationDto.getUemail(),
                passwordEncoder.encode(registrationDto.getUpassword()),registrationDto.getUsecurityQ(),registrationDto.getUsecurityA(),Arrays.asList(uroles) );
        
        return userRepository.save(user);
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
        User user = userRepository.findByUemailid(username);
        if(user == null) {
            throw new UsernameNotFoundException("Invalid username or password or User does not exist!");
        }
        return new org.springframework.security.core.userdetails.User(user.getUemailid(), user.getUpassword(), mapRolesToAuthorities(user.getRoles()));
            
    }
        private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection<Role> roles){
        return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());
    }
    
}

The MainController.java

package net.cdac.TMS.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {
    
    @GetMapping("/UserLogin")
    public String login() {
        return "UserLogin";
    }
    
    @GetMapping("/")
    public String home() {
        return "GuestHome";
    }
}

On console it's showing :

2022-09-15 14:55:16.261 TRACE 81374 --- [nio-8787-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - []
2022-09-15 14:57:51.170 DEBUG 81374 --- [nio-8787-exec-6] org.hibernate.SQL                        : 
    select
        user0_.id as id1_1_,
        user0_.uname as uname2_1_,
        user0_.uemailid as uemailid3_1_,
        user0_.upassword as upasswor4_1_,
        user0_.usecuritya as usecurit5_1_,
        user0_.usecurityq as usecurit6_1_ 
    from
        user user0_ 
    where
        user0_.uemailid=?
Hibernate: 
    select
        user0_.id as id1_1_,
        user0_.uname as uname2_1_,
        user0_.uemailid as uemailid3_1_,
        user0_.upassword as upasswor4_1_,
        user0_.usecuritya as usecurit5_1_,
        user0_.usecurityq as usecurit6_1_ 
    from
        user user0_ 
    where
        user0_.uemailid=?
2022-09-15 14:57:51.170 TRACE 81374 --- [nio-8787-exec-6] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - []

Please help me in resolving this login issue and how to successfully login and redirect to the GuestHome.html page.

1 Answers

Try to use @Param.

@Query("SELECT u FROM User u WHERE u.uemailid =:uemailid")
User findByUemailid(@Param String uemailid);

Support for legacy-style query parameter ('?') declarations in HQL/JPQL queries has been removed. This feature has been deprecated since Hibernate 4.1 and finally removed in 5.3 version.

Related