#java #hibernate #jpa
#Ява #зимовать #jpa
Вопрос:
Я выполняю динамический веб-проект с использованием JPA в Java 17. У меня есть класс под названием UserEntity. На первой странице у меня есть кнопка регистрации, которая имеет следующую функциональность:
private void register(HttpServletRequest request, HttpServletResponse response) { String password = request.getParameter("register-pass"); String repeatPassword = request.getParameter("confirm-register-pass"); if (!password.equals(repeatPassword)) { request.setAttribute("error", "Password mismatch!"); RequestDispatcher dispatcher = request.getRequestDispatcher("error.jsp"); try { dispatcher.forward(request, response); } catch (ServletException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { JPAUserRepository repo = new JPAUserRepository(); String username = request.getParameter("register-user"); String email = request.getParameter("register-email"); UserEntity user = new UserEntity(username, password, email); if(repo.registerUser(user)) { HttpSession session = request.getSession(); session.setAttribute("user", user); try { response.sendRedirect("profile.jsp"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else { } } }
Функция registerUser из репозитория является:
public boolean registerUser(UserEntity user) { EntityManager em = getEntityManager(); try { em.getTransaction().begin(); em.persist(user); em.getTransaction().commit(); } catch (TransactionalException e) { em.getTransaction().rollback(); return false; } finally { em.close(); } return true; }
Это мое persistence.xml:
lt;?xml version="1.0" encoding="UTF-8"?gt; lt;persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"gt; lt;persistence-unit name="MetaVerse" transaction-type="RESOURCE_LOCAL"gt; lt;providergt; org.hibernate.jpa.HibernatePersistenceProvider lt;/providergt; lt;classgt;uni.fmi.masters.entities.UserEntitylt;/classgt; lt;classgt;uni.fmi.masters.entities.CommentEntitylt;/classgt; lt;propertiesgt; lt;property name="hibernate.archive.autodetection" value="class" /gt; lt;property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /gt; lt;property name="hibernate.connection.driver_class" value="org.h2.Driver" /gt; lt;property name="hibernate.connection.url" value="jdbc:h2:~/MetaVerseDB"/gt; lt;property name="hibernate.connection.user" value="sa"/gt; lt;property name="hibernate.connection.password" value=""/gt; lt;property name="hibernate.show_sql" value="true"/gt; lt;property name="hibernate.flushMode" value="FLUSH_AUTO"/gt; lt;property name="hibernate.hbm2ddl.auto" value="update"/gt; lt;/propertiesgt; lt;/persistence-unitgt; lt;/persistencegt;
Когда я нажимаю «Зарегистрироваться», возникает ошибка NullPointerException. Я добавил в путь сборки javassist-3.27.0-GA-javadoc.jar, но вопрос до сих пор не решен. Как я могу решить эту проблему?
Root Cause java.lang.NullPointerException: Cannot invoke "java.lang.reflect.AccessibleObject.setAccessible(boolean)" because "ao" is null javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103) javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:151) javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134) javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95) javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:131) javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:530) javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:515) javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:451) javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:422) org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:75) org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162) org.hibernate.tuple.entity.AbstractEntityTuplizer.lt;initgt;(AbstractEntityTuplizer.java:156) org.hibernate.tuple.entity.PojoEntityTuplizer.lt;initgt;(PojoEntityTuplizer.java:58) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88) org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116) org.hibernate.tuple.entity.EntityMetamodel.lt;initgt;(EntityMetamodel.java:382) org.hibernate.persister.entity.AbstractEntityPersister.lt;initgt;(AbstractEntityPersister.java:519) org.hibernate.persister.entity.SingleTableEntityPersister.lt;initgt;(SingleTableEntityPersister.java:124) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:129) org.hibernate.internal.SessionFactoryImpl.lt;initgt;(SessionFactoryImpl.java:300) org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462) org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892) org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58) javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) uni.fmi.masters.repositories.JPAUserRepository.getEntityManager(JPAUserRepository.java:47) uni.fmi.masters.repositories.JPAUserRepository.registerUser(JPAUserRepository.java:16) uni.fmi.masters.HelloWorldServlet.register(HelloWorldServlet.java:128) uni.fmi.masters.HelloWorldServlet.doPost(HelloWorldServlet.java:68) javax.servlet.http.HttpServlet.service(HttpServlet.java:652) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Ответ №1:
Насколько я знаю, есть несколько вещей, которые могут вызвать это
- Ваш класс сопоставления Java POJO может не иметь пустого конструктора/конструктора по умолчанию
- Любые коллекции, которые у вас есть, должны иметь конструктор по умолчанию или переопределенный хэш-код и метод equals. То есть те же правила применяются к любым объединенным коллекциям/родительско-дочерним.
Если у вас есть конструкторы, подходящие для классов POJO, проверьте файл hibernate.properties и попробуйте изменить
hibernate.bytecode.provider=javassist
Для
hibernate.bytecode.provider=bytebuddy
Ответ №2:
Я удалил существующий javaasisst, установил его снова, и теперь он работает с новейшей версией.
Комментарии:
1. Значит, мой ответ был правильным? если да, пожалуйста, одобрите это
2. Если это так, то это сообщение не полезно для сообщества, поэтому не стесняйтесь удалять его