Ich verwende einen GlassFish 4.0 Server und serverseitige JPA-basierte Klassen, die ich über JAX-RS liefern möchte. Dies funktioniert bisher für einfache Entitäten. Wenn ich jedoch eine @ OneToMany-Beziehung habe, zum Beispiel UND eine verknüpfte Entität vorhanden ist, gibt der Server einen 500-internen Serverfehler zurück. In diesem Fall wird nichts im Serverprotokoll protokolliert. Um den Fehler zu finden, habe ich eine kleine benutzerdefinierte JSP-Seite erstellt, um mehr Informationen darüber zu erhalten, was passiert ist. Der Code ist nur dies:GlassFish 4.0 w/Jersey gibt 500 interne Serverfehler ohne Ausnahme zurück
Status: <%= pageContext.getErrorData().getStatusCode() %>
Throwable: <%= pageContext.getErrorData().getThrowable() %>
Leider ist der Ausgang nur "Status: 500 Throwable: null"
Meine eigene serverseitigen Code ordnungsgemäß ausgeführt scheint (habe einige Debug-Ausgabe), aber jedoch , ein Fehler taucht auf. In diesem Beispiel können die Benutzer und Ausgabe Klassen, ohne ein Problem abgerufen werden, es sei denn es eine IssueComment Einheit verknüpft ist:
Benutzerklasse:
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
}
Benutzerklasse:
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:
Der Webservice ist wie folgt:
Ich habe den Client-Quellcode weggelassen, da er serverseitig ist und mit einem normalen Browser reproduziert werden kann, also keine Notwendigkeit für Client-Code hier IMHO.
Scheint wie eine Nullzeigerausnahme. Können Sie debuggen? –
Haben Sie den Entwicklungsmodus in Ihrer web.xml aktiviert? – unwichtich
@Sotirios: Leider nicht - wenn ich versuche, die Protokollierung auf FINEST zu setzen oder den Server im Debug-Modus zu starten, bekommt Eclipse eine TimeOutException, wenn ich versuche, GlassFish zu starten. Ich werde den Entwicklungsmodus ausprobieren. Es ist derzeit nicht eingeschaltet. – grobmotoriker