我正在尝试通过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之类的东西。我只是不知道如何解决这个问题,我将非常感谢您的帮助。 预先感谢!