2013-08-13 9 views
8

मैं एक ग्लासफ़िश 4.0 सर्वर और सर्वर-पक्षीय जेपीए-आधारित कक्षाओं का उपयोग कर रहा हूं, जिसे मैं जेएक्स-आरएस के माध्यम से वितरित करना चाहता हूं। यह सरल संस्थाओं के लिए अभी तक ठीक काम करता है। हालांकि, अगर मेरे पास उदाहरण के लिए @OneToMany संबंध है और एक लिंक की गई इकाई है, तो सर्वर 500 आंतरिक सर्वर त्रुटि देता है। उस स्थिति में, सर्वर लॉग में कुछ भी लॉग नहीं है। त्रुटि को खोजने के लिए, मैंने जो हुआ उसके बारे में अधिक जानकारी प्राप्त करने के लिए मैंने एक छोटा कस्टम जेएसपी पृष्ठ बनाया।ग्लासफ़िश 4.0 डब्ल्यू/जर्सी अपवाद के बिना 500 आंतरिक सर्वर त्रुटि देता है

Status: <%= pageContext.getErrorData().getStatusCode() %> 
Throwable: <%= pageContext.getErrorData().getThrowable() %> 

दुर्भाग्य से, उत्पादन सिर्फ ": 500 फेंकने योग्य: स्थिति अशक्त" है: (कुछ डिबग आउटपुट किया)

मेरा अपना सर्वर तरफा कोड को ठीक से चलाने के लिए लगता है, लेकिन फिर भी कोड सिर्फ इस है , कुछ त्रुटि उभरती है। इस उदाहरण में, उपयोगकर्ता और समस्या कक्षाएं एक समस्या के बिना प्राप्त किया जा सकता है जब तक कि वहाँ एक लिंक किए गए IssueComment इकाई है:

उपयोगकर्ता वर्ग:

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.... 
} 

वेबसाइट सेवा निम्नानुसार है:

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; 
    } 
} 

मैंने क्लाइंट स्रोत कोड छोड़ दिया है क्योंकि यह सर्वर-पक्षीय है और इसे सामान्य ब्राउज़र के साथ पुन: उत्पन्न किया जा सकता है, इसलिए यहां क्लाइंट कोड के लिए IMHO की कोई आवश्यकता नहीं है।

+0

एक शून्य सूचक अपवाद की तरह लगता है। क्या आप डीबग कर सकते हैं? –

+0

क्या आपके पास अपने web.xml में विकास मोड चालू है? – unwichtich

+0

@Sotirios: दुर्भाग्य से नहीं - जब मैं लॉगिंग को फिनस्ट में सेट करने या डीबग मोड में सर्वर शुरू करने का प्रयास करता हूं, तो ग्लासफ़िश लॉन्च करने का प्रयास करते समय एक्लिप्स को टाइमऑट अपवाद प्राप्त हो रहा है। मैं विकास मोड का प्रयास करूंगा। यह वर्तमान में चालू नहीं है। – grobmotoriker

उत्तर

8

सुनिश्चित करें कि आपके पास ग्राफ़ (ऑब्जेक्ट्स) में कोई चक्रीय संदर्भ नहीं है जिसे आप एक्सएमएल में मार्शल करने की कोशिश कर रहे हैं।

User -> IssueComment -> (the same) User 

या

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

ऐसी संरचनाएं एक्सएमएल में मार्शल नहीं किया जा सकता: उदाहरण के लिए, यह एक समस्या हो सकती है।

नोट:IssueComment (मुझे लगता है कि यह आवश्यक नहीं है, लेकिन यह यह वहाँ बेहतर है) करने के लिए @XmlRootElement टिप्पणी जोड़ें।

नोट: हम लॉगिंग मुद्दे के बारे में जानते हैं और इसे JERSEY-2000 के हिस्से के रूप में हल किया जाएगा।

+0

आह, धन्यवाद! मैं कल इसे देख लूंगा! – grobmotoriker

+2

यही वह है! लॉगिंग मुद्दे के बारे में जानकारी के लिए जानकारी के लिए बहुत बहुत धन्यवाद। मैंने @XmlTransient के साथ गुणों (उस उदाहरण के लिए, उपयोगकर्ता और समस्या विशेषता में समस्या विशेषता) को एनोटेट किया है, इसलिए ऑब्जेक्ट को मार्शल करते समय उन्हें ध्यान में नहीं रखा जाता है। – grobmotoriker

+3

अतिरिक्त जानकारी: यदि कोई उस समस्या का सामना कर रहा है - विशेषता नहीं है, लेकिन गेटटर विधियों को @XmlTransient के साथ एनोटेट किया जाना चाहिए – grobmotoriker

संबंधित मुद्दे