[英]GlassFish 4.0 w/ Jersey returns 500 internal server error without exception
我正在使用GlassFish 4.0服務器和服務器端JPA類,我想通過JAX-RS提供。 到目前為止,這對於簡單實體來說很好。 但是,如果我有一個@OneToMany關系例如並且存在鏈接實體,則服務器返回500內部服務器錯誤。 在這種情況下,服務器日志中不會記錄任何內容。 為了找到錯誤,我創建了一個小的自定義JSP頁面,以獲取有關所發生事件的更多信息。 代碼就是這樣:
Status: <%= pageContext.getErrorData().getStatusCode() %>
Throwable: <%= pageContext.getErrorData().getThrowable() %>
不幸的是,輸出只是“狀態:500 Throwable:null”
我自己的服務器端代碼似乎運行正常(做了一些調試輸出),但是,出現了一些錯誤。 在此示例中,除非存在鏈接的IssueComment實體,否則可以毫無問題地檢索User和Issue類:
用戶類:
package my.application.model;
import static javax.persistence.FetchType.LAZY;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
/**
* The persistent class for the User database table.
*
*/
@XmlRootElement
@Entity(name="User")
@Table(name="User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="failedLogin")
private short failedLogin;
@Column(name="firstname")
private String firstname;
@Column(name="lastname")
private String lastname;
@Column(name="middlename")
private String middlename;
@Column(name="password")
private String password;
@Column(name="username")
private String username;
//bi-directional many-to-one association to IssueComment
@OneToMany(mappedBy="user", fetch = LAZY)
private List<IssueComment> issueComments;
//bi-directional many-to-one association to SignalComment
@OneToMany(mappedBy="user", fetch = LAZY)
private List<SignalComment> signalComments;
//bi-directional many-to-one association to SignalMeasure
@OneToMany(mappedBy="user", fetch = LAZY)
private List<SignalMeasure> signalMeasures;
public User() {
}
public int getId() {
return this.id;
}
// more getters and setters auto-generated by Eclipse
}
用戶類:
package my.application.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
@NamedQuery(
name = "getSingleIssue",
query = "SELECT i FROM Issue i WHERE i.id = :id"
)
/**
* The persistent class for the Issue database table.
*
*/
@XmlRootElement
@Entity(name="Issue")
@Table(name="Issue")
public class Issue implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="concernedModule")
private String concernedModule;
@Column(name="createdate")
@Temporal(TemporalType.TIMESTAMP)
private Date createdate;
@Column(name="duedate")
@Temporal(TemporalType.TIMESTAMP)
private Date duedate;
@Column(name="priority")
private int priority;
@Column(name="reminderdate")
@Temporal(TemporalType.TIMESTAMP)
private Date reminderdate;
@Column(name="responsibleUserId")
private int responsibleUserId;
@Column(name="sendingModule")
private String sendingModule;
@Column(name="severity")
private int severity;
@Column(name="status")
private int status;
@Column(name="title")
private String title;
// bidirectional many-to-one association to IssueComment
@OneToMany(mappedBy = "issue")
private List<IssueComment> issueComments;
public Issue() {
}
public int getId() {
return this.id;
}
// more getters and setters....
}
IssueComment:
package my.application.model;
import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;
/**
* The persistent class for the IssueComment database table.
*
*/
@Entity(name="IssueComment")
@Table(name="IssueComment")
public class IssueComment implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Lob
@Column(name="comment")
private String comment;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="time")
private Date time;
//bi-directional many-to-one association to Issue
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="issueId")
private Issue issue;
//bi-directional many-to-one association to User
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="userId")
private User user;
public IssueComment() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
// getters/setters....
}
Web服務如下:
package my.application.server.webservice;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
import org.glassfish.jersey.server.ResourceConfig;
import my.application.data.UserStorage;
import my.application.logger.Logger;
import my.application.model.Signal;
import my.application.model.SignalComment;
import my.application.model.User;
@Provider
@Path("User")
public class UserService extends ResourceConfig {
private UserStorage storage = new UserStorage();
public UserService() {
this.packages("my.application.model");
}
@Produces(MediaType.APPLICATION_XML)
@Path("load")
@GET
public User getUser(@QueryParam("id") int id) {
try {
Logger.getInstance().log("fetching id: " + id);
User u = storage.getUser(id);
Logger.getInstance().log("number of signal comments: " + u.getSignalComments().size());
SignalComment sc = u.getSignalComments().get(0);
Logger.getInstance().log("Signal 0 comment: " + sc.getComment());
Signal s = sc.getSignal();
Logger.getInstance().log("Signal subject: " + s.getSubject());
return u;
} catch (Exception e) {
e.printStackTrace();
}
// this code is not being reached (so no errors in this method):
Logger.getInstance().log("---EXCEPTION HAS BEEN THROWN---");
return null;
}
}
我放棄了客戶端源代碼,因為它是服務器端的,可以使用普通的瀏覽器進行復制,所以沒有必要在這里使用客戶端代碼恕我直言。
確保在您嘗試編組為XML的圖形(對象)中沒有任何循環引用。 例如,這可能會導致問題:
User -> IssueComment -> (the same) User
要么
User -> IssueComment -> Issue -> IssueComment -> (the same) User
這樣的結構不能編組成XML。
注意:將@XmlRootElement
注釋添加到IssueComment
(我認為不需要它,但最好將它IssueComment
那里)。
注意:我們知道日志記錄問題,它將作為JERSEY-2000的一部分解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.