所以在学校我正在研究RESTFUL-webapi。直到最近我才使用了1个存储库。现在我们终于有了2+,我改变了我们调用EntityManagerFactory等的方法。我把它改成了一个抽象类,所以可以从那里为每个存储库调用它。
public abstract class EntityController {
protected static EntityManagerFactory entityManagerFactory = null;
protected static EntityManager entityManager = null;
protected static EntityTransaction entityTransaction = null;
public void entityStart(){
entityManagerFactory = Persistence.createEntityManagerFactory("research");
entityManager = entityManagerFactory.createEntityManager();
entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
}
public void entityCommitAndClose(Boolean doCommit){
if (doCommit){
entityTransaction.commit();
}
entityManager.close();
entityManagerFactory.close();
}
}
现在我得到的错误就是这个:
持久性提供程序正在尝试使用persistence.xml文件中的属性来解析数据源。必须在openjpa.ConnectionDriverName或javax.persistence.jdbc.driver属性中指定Java数据库连接(JDBC)驱动程序或数据源类名。配置中提供了以下属性:“org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@dfd7dd11”。
我做了一些谷歌搜索,大多数人说这是与数据库问题的联系。然而,在我将它们放入抽象类之前,Entitymanagers工作正常。
这是我的persistence.xml文件,位于正确的位置(resources / meta-inf)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="research" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- JPA standard -->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/groepswerk" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="javax.persistence.schema-generation.database.action" value="create" /> <!--drop-and-create-->
<property name="openjpa.MetaDataRepository" value="Preload=true" />
<!-- Hibernate specific -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.xxx" value="xxx"/>
</properties>
</persistence-unit>
</persistence>
所以我希望你们中的一些人可以用我做错的事情来激励我吗?
编辑:
其中一个存储库的源代码: 包app.repositories;
import app.models.Student;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.persistence.*;
import java.util.List;
public class StudentRepository extends EntityController implements IStudentRepository {
final static Logger LOGGER = LogManager.getLogger(ExamRepository.class);
// to get a student by name
@Override
public Student getStudentByNumber(String number) {
try {
entityStart();
TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Student as s WHERE s.studentNumber=?1", Student.class);
query.setParameter(1, number);
return query.getSingleResult();
} catch (IllegalArgumentException exception){
LOGGER.error(exception);
} finally {
entityCommitAndClose(false);
}
return null;
}
// to get a list of all students
@Override
public List<Student> getAllStudents() {
try {
entityStart();
TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Student as s", Student.class);
return query.getResultList();
} catch (IllegalArgumentException exception){
LOGGER.error(exception);
} finally {
entityCommitAndClose(false);
}
return null;
}
// if student logs in, a student gets created
@Override
public void createStudent(Student student) {
entityStart();
Student newStudent = new Student(student);
entityManager.persist(newStudent);
entityCommitAndClose(true);
}
@Override
public void changeDownloadStatus(Student user, Boolean status){
entityStart();
Student student = entityManager.find(Student.class, user.getId());
student.setDownloaded(status);
entityCommitAndClose(true);
}
@Override
public void changeUploadStatus(Student user, Boolean status){
entityStart();
Student student = entityManager.find(Student.class, user.getId());
student.setUploaded(status);
entityCommitAndClose(true);
}
}
编辑Catalina Logs:
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at app.repositories.EntityController.entityCommitAndClose(EntityController.java:26)
at app.repositories.StudentRepository.getAllStudents(StudentRepository.java:42)
at app.services.StudentService.getAllStudents(StudentService.java:16)
at app.controllers.StudentController.getAllStudents(StudentController.java:17)
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.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
... 38 more
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at app.repositories.EntityController.entityCommitAndClose(EntityController.java:26)
at app.repositories.StudentRepository.getAllStudents(StudentRepository.java:42)
at app.services.StudentService.getAllStudents(StudentService.java:16)
at app.controllers.StudentController.getAllStudents(StudentController.java:17)
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.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
... 38 more
07-May-2018 14:46:12.347 SEVERE [http-nio-8080-exec-10] org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage Error occurred during error handling, give up!
org.apache.cxf.interceptor.Fault
at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:191)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
at org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invoke(AutoJAXRSInvoker.java:68)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.doInvoke(CxfRsHttpListener.java:253)
at org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:423)
at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:169)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at app.repositories.EntityController.entityCommitAndClose(EntityController.java:26)
at app.repositories.StudentRepository.getAllStudents(StudentRepository.java:42)
at app.services.StudentService.getAllStudents(StudentService.java:16)
at app.controllers.StudentController.getAllStudents(StudentController.java:17)
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.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
... 38 more
答案 0 :(得分:0)
在咨询了老师之后,这就是我提出的解决方案。它确实改变了我使用抽象类的概念,但确实解决了所有问题。
public class EntityController {
private static EntityManagerFactory entityManagerFactory = null;
static {
entityManagerFactory = Persistence.createEntityManagerFactory("research");
}
public static EntityManager getEntityManager(){
return entityManagerFactory.createEntityManager();
}
public static void startTransaction(EntityManager entityManager){
entityManager.getTransaction().begin();
}
public static void finishTransaction(EntityManager entityManager){
if (entityManager.isOpen()){
EntityTransaction entityTransaction = entityManager.getTransaction();
if (entityTransaction.isActive()) {
entityManager.getTransaction().commit();
}
entityManager.close();
}
}
}