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