2017-08-01 49 views
0

我在使用Java時顯示一些JPA實體時出現問題。我對這門語言並不是很熟悉,所以我不確定是否可以結合我現在所做的事情。我有這個Student類,這顯然代表了學生:顯示JPA實體的Java

@Entity 
@Table 
public class Student implements Serializable { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    @Email 
    private String email; 

    @Column(unique=true) 
    private String studentNumber; 

    private String firstName; 

    private String lastName; 

    public Student() {} 

    public Student(String studentNumber, String firstName, String lastName, String email) { 
     this.studentNumber = studentNumber; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
    } 

現在的想法是有一個RESTful服務,並能夠通過找到他們的學生人數,顯示所有的學生,或只是那些。因此,我有這個在我的堅持類:

@Override 
public Student findByStudentNumber(String studentNumber) { 
    Object entity = em.createQuery("SELECT * FROM students st where st.studentNumber = :val") 
      .setParameter("val", studentNumber).getSingleResult(); 
    return (Student) entity; 
} 

@Override 
public List<Student> getAll() { 
    List<Student> students = em.createQuery(criteriaQuery).getResultList(); 
    return students; 
} 

我的控制器:

@Path("/students") 
public class StudentController { 
    @Inject 
    private StudentPersistence studentPersistence; 

@GET 
@Path("/get") 
public List<Student> getAll() { 
    List<Student> all = studentPersistence.getAll(); 
    return all; 
} 

@GET 
@Path("{studentNr}") 
public Student getStudent(@PathParam("studentNr") String id) { 
    return studentPersistence.findByStudentNumber(id); 
} 

但是,我似乎無法讓他們到控制器,因爲它不斷拋出500內部服務器錯誤。我的問題是:這是結合這種方式,還是有更好的方式來顯示這些實體?

編輯:一種用於我的500錯誤堆棧跟蹤:

01-Aug-2017 14:04:24.769 SEVERE [http-nio-8081-exec-1] com.sun.jersey.spi.container.ContainerResponse.logException Mapped exception to response: 500 (Internal Server Error) 
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class models.Student, and Java type class models.Student, and MIME media type application/xml was not found 
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at filters.CorsFilter.doFilter(CorsFilter.java:33) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class models.Student, and Java type class models.Student, and MIME media type application/xml was not found 
    ... 33 more 
+0

500內部服務器錯誤意味着代碼有問題。請添加完整的堆棧跟蹤 – StanislavL

+0

@StanislavL我明白了,現在就在那裏! – dnsko

+0

@dnsko,根據你的異常判斷,你缺少的是負責將'Student' java對象轉換爲'XML'形式的代碼。 –

回答

0

500指內部服務器錯誤,這似乎是一個意外的異常,我能看到爲什麼,你需要指定你產生價值的戰略,我相信,你的目標是爲自動遞增,所以你可以使用AUTO

@Entity 
@Table 
public class Student implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer id; 

檢查這個link有關策略的詳細信息,您可以使用

+1

我相信默認的是'GenerationType.AUTO'!所以它不一定要明確提及它。 –

0

到目前爲止,你沒有做任何可以顯示用戶數據的事情..你創建了一個模型類(學生),你實現了CRUD方法(它們應該使用DAO模式定義),你實現了控制器,但是html的位置在哪裏/ jsp應該顯示數據? 我建議你用spring來定義web服務,它更簡單,更好;你也應該考慮調用DAO層的服務層,然後控制器調用服務。這樣你直接從控制器調用CRUD方法,以便將Web層連接到集成(db)層:這是錯誤的。

實現一個jsp或一個html文件,在這裏你顯示了一些東西。使用jsp標籤或更新的東西(spring)顯示你想要的數據,然後看看服務層,DAO模式(但我認爲你已經知道了)和spring(你需要的模塊是Ioc,依賴關係和mvc)。

更新: 我看見你的堆棧跟蹤..我不知道這是否是同樣的問題,看看這個: A message body writer for Java class not found

0

一些修改,必須添加:

1 - 你必須指定表名@Table(name = "table_name")

2 - 你必須指定列名,爲例:

@Column(name="firstName") 
    private String firstName; 

3 - 當您使用HQL時,您必須指定實體名稱而不是表名。在你的情況下,"SELECT * FROM students....將改變"SELECT * FROM Student

+0

在「@ Table」註釋中指定名稱不是必需的。默認情況下,它採用下劃線分隔的小寫類名。 '@ Column'也是一樣 –