2013-08-13 6 views
8

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.

+0

Scheint wie eine Nullzeigerausnahme. Können Sie debuggen? –

+0

Haben Sie den Entwicklungsmodus in Ihrer web.xml aktiviert? – unwichtich

+0

@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

Antwort

8

Stellen Sie sicher, dass Sie keine zyklischen Referenzen in Graphen (Objekten) haben, die Sie in XML umwandeln möchten. Zum Beispiel könnte dies ein Problem verursachen:

User -> IssueComment -> (the same) User 

oder

User -> IssueComment -> Issue -> IssueComment -> (the same) User 

Solche Strukturen nicht in XML rangieren können.

Hinweis: hinzufügen @XmlRootElement Anmerkung zu IssueComment (ich glaube es nicht gebraucht wird, aber es ist besser, um es dort zu haben).

Hinweis: Wir wissen über das Protokollierungsproblem und es wird als Teil von JERSEY-2000 gelöst werden.

+0

Ah, danke! Ich werde das morgen überprüfen! – grobmotoriker

+2

Das war's! Vielen Dank für die Info, auch für die Info über das Logging-Problem. Ich habe die Attribute (z. B. das Attribut user und issue in IssueComment) mit @XmlTransient versehen, damit sie beim Marshallen des Objekts nicht berücksichtigt werden. – grobmotoriker

+3

Zusätzliche Informationen: Wenn dieses Problem auftritt - keine Attribute, aber die Getter-Methoden sollten mit @XmlTransient kommentiert werden – grobmotoriker

Verwandte Themen