Как включить локальную базу данных mySQL, связанную с HIBERNATE, в веб-службу RESTful, развернутую на локальном сервере GLASSFISH? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь изучить тему веб-сервисов с IntelliJ, Java, Maven, Джерси, Glassfish, MySQL Workbench и Hibernate.Я успешно создал веб-сервис RESTful (работающий с POJO), смог развернуть его на локальном домене Glassfish, и все мои действия CRUD выполняются через Postman.

Теперь я хотел добавить поддержку БД через Hibernate.Я начал с тестирования без развертывания Glassfish на простом Java-приложении.Я создал простую локальную БД с помощью MySQL Workbench, связал ее с Java-кодом с помощью аннотаций Hibernate, и я могу успешно подключаться к БД и вносить изменения в ее таблицу.

Все прекрасно работает в приложении, но не тогда, когда я развертываю его на сервере и пытаюсь получить к нему доступ с помощью методов REST CRUD через Postman.

Похоже, я не могу подключиться к БД из Glassfish, так же, как я делаю это из приложения.Я получаю NullPointerException от Postman при выполнении GET для URL (да, я уверен, что есть объект с этим идентификатором в Db, я вижу его в SQL Workbench, и тот же метод прекрасно работает в innap)

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)
    .
    .
    .

Вот как выглядит класс, который подключается к БД:

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 или что-то в этом роде.Я просто понятия не имею, как решить эту проблему, и я действительно оценил бы любую помощь.Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...