请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于 Hib工具类 sessionFactory 初始化空指针报错的问题

老师好,我按照老师的方法敲代码,jdk版本已经回退到8,在Hib工具类的初始化方法Init()的try catch里丢出了一个空指针错误,经过debug确定为

    private static void init() {
        // 从hibernate.cfg.xml文件初始化
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure() // configures settings from hibernate.cfg.xml
                .build();
        try {
            // build 一个sessionFactory
            sessionFactory = new MetadataSources(registry)  // sessionFactory = null
                    .buildMetadata()
                    .buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();	// 执行了输出异常
            // 错误则打印输出,并销毁
            StandardServiceRegistryBuilder.destroy(registry);
        }
    }

这里出了异常直接转到catch里,sessionFactory为null,报空指针异常

报错
20-Feb-2020 18:18:30.744 涓ラ噸 [http-nio-8848-exec-5] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [TechatApiServlet] in context with path [/Gradle___ink_techat___TechatWeb_1_0_SNAPSHOT_war] threw exception [java.lang.NullPointerException] with root cause
	java.lang.NullPointerException
		at ink.techat.web.push.utils.Hib.session(Hib.java:58)
		at ink.techat.web.push.factory.UserFactory.register(UserFactory.java:27)
		at ink.techat.web.push.service.AccountService.register(AccountService.java:24)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:74)
		at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
		at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
		at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:247)
		at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
		at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:388)
		at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:346)
		at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
		at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:337)
Hib工具类源代码 
package ink.techat.web.push.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import java.util.logging.Logger;

/**
 * Created by qiujuer
 * on 2017/2/17.
 */
public class Hib {
    private static final Logger LOGGER = Logger.getLogger(Hib.class.getName());
    // 全局SessionFactory
    private static SessionFactory sessionFactory;

    static {
        // 静态初始化sessionFactory
        init();
    }

    private static void init() {
        // 从hibernate.cfg.xml文件初始化
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure() // configures settings from hibernate.cfg.xml
                .build();
        try {
            // build 一个sessionFactory
            sessionFactory = new MetadataSources(registry)
                    .buildMetadata()
                    .buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
            // 错误则打印输出,并销毁
            StandardServiceRegistryBuilder.destroy(registry);
        }
    }

    /**
     * 获取全局的SessionFactory
     *
     * @return SessionFactory
     */
    public static SessionFactory sessionFactory() {
        return sessionFactory;
    }

    /**
     * 从SessionFactory中得到一个Session会话
     *
     * @return Session
     */
    public static Session session() {
        return sessionFactory.getCurrentSession();
    }

    /**
     * 关闭sessionFactory
     */
    public static void closeFactory() {
        if (sessionFactory != null) {
            sessionFactory.close();
        }
    }
}

AccountService.java 源代码
package ink.techat.web.push.service;

import ink.techat.web.push.bean.api.account.RegisterModel;
import ink.techat.web.push.bean.card.UserCard;
import ink.techat.web.push.bean.db.User;
import ink.techat.web.push.factory.UserFactory;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

/**
 * @author NickCharlie
 * 127.0.0.1/api/account/...
 */
@Path("/account")
public class AccountService {

    @POST
    @Path("/register")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public UserCard register(RegisterModel model){

        User user = UserFactory.register(model.getAccount(),
                model.getPassword(), model.getName());

        if(user != null){
            UserCard card = new UserCard();
            card.setName(user.getName());
            card.setPhone(user.getPhone());
            card.setSex(user.getSex());
            card.setIsFollow(true);
            card.setModifyAt(user.getUpdateAt());
            return card;
        }
        return null;
    }
}

hibernate.cfg.xml 除了更改了数据库地址和账号密码以及 mapping 映射以外,没有其他的更改。

正在回答

1回答

建议核查一下hibernate.cfg.xml 文件与项目的文件存放的位置以及命名是否有差异。
错误是因为初始化的时候没有正确初始化导致的问题,这个问题一般是因为:hibernate.cfg.xml  文件读取失败导致的。

1 回复 有任何疑惑可以回复我~
  • 提问者 NickCharlie #1
    我直接在init初始化代码里加入了hibernate.cfg.xml的路径,没有出现找不到hibernate.cfg.xml的错误
    
    错误是在 init()中的
    try {
                // build 一个sessionFactory
                sessionFactory = new MetadataSources(registry)
                        .buildMetadata() // 错误在这一行
                        .buildSessionFactory();
    
    Server的运行报错如下
    org.hibernate.AnnotationException: @OneToOne or @ManyToOne on ink.techat.web.push.bean.db.User.groups references an unknown entity: java.util.Set
    
    最后查明的原因是,User里的Set<Group> groups字段应该是OnetoMany,我写成了ManytoOne
    回复 有任何疑惑可以回复我~ 2020-02-21 01:14:54
  • 提问者 NickCharlie #2
    但是接口调试POST的时候 显示连接网络时发生异常
    记录太长,放网页里了
    http://www.techat.ink:8000/web/#/1?page_id=5
    回复 有任何疑惑可以回复我~ 2020-02-21 01:20:04
  • 提问者 NickCharlie #3
    报错org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions Field 'ownerId' doesn't have a default value
    回复 有任何疑惑可以回复我~ 2020-02-21 15:47:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信