java.lang.Исключение NullPointerException: Не удается вызвать «java.lang.reflect.AccessibleObject.setAccessible(логическое значение)», потому что «ao» равно нулю

#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. Если это так, то это сообщение не полезно для сообщества, поэтому не стесняйтесь удалять его