如何启用由HIBERNATE绑定到本地GLASSFISH服务器上部署的RESTful Web服务的本地mySQL DATABASE数据库?

时间:2018-12-14 11:34:38

标签: java mysql hibernate rest glassfish

我正在尝试通过IntelliJ,Java,Maven,Jersey,Glassfish,mySQL Workbench和Hibernate学习Web服务主题。 我已经成功创建了一个RESTful Web服务(在POJO上工作),并设法将其部署在本地Glassfish域上,并且我所有的CRUD操作都通过Postman运行。

现在,我想通过Hibernate添加数据库支持。我首先在简单的Java应用程序上进行了没有Glassfish部署的测试。我通过mySQL Workbench创建了简单的本地数据库,并通过Hibernate批注将其绑定到Java代码,并且可以成功连接到数据库并对其表进行更改。

inapp一切正常,但是当我将其部署在服务器上并尝试通过Postman通过REST CRUD方法访问它时,一切都不正常。

似乎我无法从Glassfish连接到数据库,就像我从应用程序执行连接一样。在URL上执行GET时,我从邮递员那里收到NullPointerException(是的,我确定Db中存在具有此ID的对象,我在sql Workbench上看到了它,并且相同的方法可以使之正常工作)

localhost:20080/messanger2/webapi/messages/2

路由方法(可以在POJO上正常工作):

@Path("/messages")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MessageResource {
    MessageService  messageService = new MessageService();
    @GET
    @Path("/{messageId}")
    public Message getMessageById(@PathParam("messageId") int id){
        return messageService.getMessage(id);
    }
.
.
.

我得到了这个堆栈跟踪:

  [2018-12-14T12:26:51.137+0100] [glassfish 5.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=31 _ThreadName=http-listener-1(4)] [timeMillis: 1544786811137] [levelValue: 900] [[
  StandardWrapperValve[Jersey Web Application]: Servlet.service() for servlet Jersey Web Application threw exception
java.lang.NullPointerException
    at mgr.rest2.database.DbOperations.findRecordById(DbOperations.java:33)
    at mgr.rest2.service.MessageService.getMessage(MessageService.java:22)
    at mgr.rest2.resource.MessageResource.getMessageById(MessageResource.java:43)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    .
    .
    .

这是连接到数据库的Class的样子:

public class DbOperations {

    public DbOperations() {
    }
.
.
.
    static Session sessionObj;
    private SessionFactory buildSessionFactory() {
        return new Configuration().configure().buildSessionFactory();
    }
    public Message findRecordById(Integer find_message_id) {
        Message findMessageObj = null;
        try {
            sessionObj = buildSessionFactory().openSession();
            sessionObj.beginTransaction();
            findMessageObj = (Message) sessionObj.get(Message.class, find_message_id);
        } catch(Exception sqlException) {
            if(null != sessionObj.getTransaction()) {
                sessionObj.getTransaction().rollback();
            }
            sqlException.printStackTrace();
        }
        return findMessageObj;
    }
.
.
.

最后是我的cfg.xml:

<?xml version='1.0' encoding='UTF-8'?>
        <!DOCTYPE hibernate-configuration PUBLIC
                "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <!-- SQL Dialect -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- Database Connection Settings -->
    <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/messangerdb</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">1234</property>
    <property name="show_sql">true</property>
    <!-- Specifying Session Context -->
    <property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>

    <!-- Mapping With Model Class Containing Annotations -->
    <mapping class="mgr.rest2.model.Message" />
</session-factory>
</hibernate-configuration>

因此,据我了解,它无法创建与数据库的连接。就像我说的,一切都在我的本地机器上,所以我虽然应该可以轻松地通过本地IP与其自身连接。我认为我在方法上犯了一个错误,也许我应该按自己的方式将数据库放在服务器上,使用嵌入式的inapp db之类的东西。我只是不知道如何解决这个问题,我将非常感谢您的帮助。 预先感谢!

0 个答案:

没有答案