'java.lang.NullPointerException: Cannot invoke "java.lang.reflect.AccessibleObject.setAccessible(boolean)" because "ao" is null

I am doing Dynamic Web Project using JPA in Java 17. I have a class called UserEntity. In the first page I have a register button, which has the following functionality:

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 {
            }
        }
    }

The registerUser function from the repository is:

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;
    }

This is my persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <persistence-unit name="MetaVerse" transaction-type="RESOURCE_LOCAL">
        <provider>
            org.hibernate.jpa.HibernatePersistenceProvider
        </provider>
        <class>uni.fmi.masters.entities.UserEntity</class>
        <class>uni.fmi.masters.entities.CommentEntity</class>
        
        <properties>
            <property name="hibernate.archive.autodetection" value="class" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
            <property name="hibernate.connection.driver_class" value="org.h2.Driver" />
            <property name="hibernate.connection.url" value="jdbc:h2:~/MetaVerseDB"/>
            <property name="hibernate.connection.user" value="sa"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.flushMode" value="FLUSH_AUTO"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    
    </persistence-unit>
</persistence>

When I click on register, NullPointerException error occurs. I have added to the build path javassist-3.27.0-GA-javadoc.jar, but the issue is still not resolved. How can I solve this problem?

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.<init>(AbstractEntityTuplizer.java:156)
    org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(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.<init>(EntityMetamodel.java:382)
    org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:519)
    org.hibernate.persister.entity.SingleTableEntityPersister.<init>(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.<init>(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)


Solution 1:[1]

As far as I know there are multiple things that can cause this

  • Your Java POJO Mapping class may not have the empty/default constructor
  • Any collections you have should have the default constructor or overridden hashcode and equals method. That is, the same rules apply for any joined collections/parent-children.

If you have your constructors right for POJO classes than check hibernate.properties file and try changing

hibernate.bytecode.provider=javassist

to

hibernate.bytecode.provider=bytebuddy

Solution 2:[2]

To those who stumble on this question looking for a clue. I had this issue on my staging environment in Google Cloud Platform but not while running locally. I solved it by updating the version of org.hibernate:hibernate-gradle-plugin and org.hibernate:hibernate-c3p0 from 5.2.9.Final to 5.6.1.Final. Magic. ?

Solution 3:[3]

I deleted the existing javaasisst, installed it again and now it works with the newest version.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vojin Puri?
Solution 2 craastad
Solution 3 Sani