Java EE / JSF / Hibernate - javax.servlet.ServletException: java .lang.IllegalArgumentException: Невозможно найти постоянный: ttfjsf.backend.User - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь разработать простой процесс входа в систему со следующими файлами:

Пользователь. java

package ttfjsf.backend;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="utenti")
public class User implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="username")
    String uname;

    @Column(name="password")
    String pwd;
}

UserRepository. java

package ttfjsf.backend;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

import org.hibernate.Session;

import lombok.Data;

import ttfjsf.backend.User;

@Data
@ManagedBean(name = "userRepository")
@ApplicationScoped
public class UserRepository {
    public User getUserByUsername(String username) {
        Session session = null;
        User u = null;

        try {
            session = HibernateUtil.getSession();
            u = session.get(User.class, username);
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (session != null)
                    session.close();
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }

        return u;
    }
}

HibernateUtil. java

package ttfjsf.backend;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import ttfjsf.backend.User;

public class HibernateUtil {

    private static SessionFactory sessionFactory = null;

    static {
        try {
            loadSessionFactory();
        } catch(Exception e) {
            System.err.println("Exception while initializing HibernateUtil");
            e.printStackTrace();
        }
    }

    public static void loadSessionFactory() {
        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        configuration.addAnnotatedClass(User.class);
        ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(servReg);
    }

    public static Session getSession() throws HibernateException {
        Session retSession = null;
        try {
            retSession = sessionFactory.openSession();
        } catch(Throwable t) {
            System.err.println("Exception while getting session...");
        }
        if (retSession == null) {
            System.err.println("Session is discovered null");
        }
        return retSession;
    }

}

hibernate.cfg. xml

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>   
      <property name = "hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name = "hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>      
      <property name = "hibernate.connection.url">jdbc:mysql://localhost/carrello_ttf?serverTimezone=CET</property>
      <property name = "hibernate.connection.username">filippi</property>      
      <property name = "hibernate.connection.password">password</property>  
   </session-factory>
</hibernate-configuration>

LoginBackingBean. java

package ttfjsf.frontend;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

import lombok.Data;
import ttfjsf.backend.Carrello;
import ttfjsf.backend.User;
import ttfjsf.backend.UserRepository;

@Data
@ManagedBean(name="login")
@RequestScoped
public class LoginBackingBean {

    private String username, pass, error = null;

    @ManagedProperty(value = "#{mySession}")
    private MySession s;

    @ManagedProperty(value = "#{userRepository}")
    private UserRepository userRepo;

    @ManagedProperty(value = "#{carrello}")
    private Carrello c;

    public String logout() {

        s.setUser(null);

        return "login";
    }

    public String doLogin() {

        User u = userRepo.getUserByUsername(username);

        if (u!=null && pass.equals(u.getPwd())) {

            c.init();
            error = null;
            s.setUser(u);

            return "home";
        }

        error = "Login errato";

        return "login";                 
    }

    public boolean getShowError() {
        return error != null;
    }

}

login.x html

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:c="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://xmlns.jcp.org/jsf/passthrough">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Home</title>
</head>
<body>
    <div class="main-content">
        <div class="loginForm">
            <h:form>
                <h:outputLabel rendered="#{login.getShowError()}" value="#{login.error}"><hr/></h:outputLabel>
                <h:inputText value="#{login.username}" style="border: none; border-bottom: 1px solid black; outline: none; padding-bottom: 5px;" p:placeholder="Username" autocomplete="off"></h:inputText>
                <br/><br/>
                <h:inputSecret value="#{login.pass}" style="border: none; border-bottom: 1px solid black; outline: none; padding-bottom: 5px;" p:placeholder="Password"></h:inputSecret>
                <br/><br/><br/>
                <h:commandButton value="LOGIN" styleClass="myButton" action="#{login.doLogin}"></h:commandButton>
            </h:form>       
        </div>
    </div>
</body>
</html>

Когда я нажимаю при входе в систему сервер выдает эту ошибку :

Type Exception Report

Message java.lang.IllegalArgumentException: Unable to locate persister: ttfjsf.backend.User

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: java.lang.IllegalArgumentException: Unable to locate persister: ttfjsf.backend.User
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

javax.faces.el.EvaluationException: java.lang.IllegalArgumentException: Unable to locate persister: ttfjsf.backend.User
    javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    javax.faces.component.UICommand.broadcast(UICommand.java:315)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

java.lang.IllegalArgumentException: Unable to locate persister: ttfjsf.backend.User
    org.hibernate.internal.SessionImpl.find(SessionImpl.java:3333)
    org.hibernate.internal.SessionImpl.find(SessionImpl.java:3274)
    ttfjsf.backend.UserRepository.get(UserRepository.java:33)
    ttfjsf.frontend.LoginBackingBean.doLogin(LoginBackingBean.java:37)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    javax.faces.component.UICommand.broadcast(UICommand.java:315)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

org.hibernate.UnknownEntityTypeException: Unable to locate persister: ttfjsf.backend.User
    org.hibernate.metamodel.internal.MetamodelImpl.locateEntityPersister(MetamodelImpl.java:721)
    org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2936)
    org.hibernate.internal.SessionImpl.access$1800(SessionImpl.java:194)
    org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2665)
    org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2648)
    org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1130)
    org.hibernate.internal.SessionImpl.find(SessionImpl.java:3297)
    org.hibernate.internal.SessionImpl.find(SessionImpl.java:3274)
    ttfjsf.backend.UserRepository.get(UserRepository.java:33)
    ttfjsf.frontend.LoginBackingBean.doLogin(LoginBackingBean.java:37)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    javax.faces.component.UICommand.broadcast(UICommand.java:315)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note The full stack trace of the root cause is available in the server logs.

Я тоже пробовал без аннотаций (@Entity, @Table e cc.) и создавал User.hbm.xml вот так:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="ttfjsf.backend.User" table="utenti">
        <id name="uname" column="username" type="string" />
        <property name="pwd" column="password" type="string" />
    </class>
</hibernate-mapping>

Тогда hibernate.cfg.xml будет выглядеть так:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>   
      <property name = "hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name = "hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>      
      <property name = "hibernate.connection.url">jdbc:mysql://localhost/carrello_ttf?serverTimezone=CET</property>
      <property name = "hibernate.connection.username">filippi</property>      
      <property name = "hibernate.connection.password">password</property>   
      <mapping resource = "ttfjsf/backend/User.hbm.xml" />  
   </session-factory>
</hibernate-configuration>

Но выдает точно такую ​​же ошибку.

Я использую Hibernate 5.4.12.Final.

Есть идеи?

...