2014-06-07 51 views
5

Bir aşağı açılır menüde, farklı bir değerin sunucu uygulamasına geçirileceği ve ardından sonsuz bir döngüye neden olacağı her zaman bir servlette sorun yaşıyorum. Açılırken seçeneği değiştirmediğimde (değerde değişiklik yok), hata yok.Servlet Gson(). ToJson sonsuz döngü

Benim JavaScript:

<script> 

function loadStaff(){ 
//dropdown 
var positionDropDown = document.getElementById("positionsDropdown"); 
//value of the drop down 
var positionID = positionDropDown.options[positionDropDown.selectedIndex].value; 

    $.getJSON('loadStaff?positionID=' + positionID, function(data) { 
      -- no populate code yet 
}); 
} 
</script> 

Benim AjaxServlet: debuggig üzerine

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     String userPath = request.getServletPath(); 

    if (userPath.equals("/loadStaff")) { 

     String positionID = request.getParameter("positionID"); 
     Position position = positionFacade.find(Integer.parseInt(positionID)); 
     Collection staffCollection = position.getStaffCollection(); 
     List<Staff> staffList = new ArrayList(staffCollection); 

     String staffListJson = new Gson().toJson(staffList); 
     response.setContentType("application/json"); 
     response.setCharacterEncoding("UTF-8"); 
     response.getWriter().write(staffListJson); 

    } 

} 

İşte

BBKod olduğunu. Hata çizgisinde gelir:

String staffListJson = new Gson().toJson(staffList); 

Çıktı hatası: Ben de bu izleri sadece stacktrace çıktısını tekrar fark ettim

> INFO: WebModule[null] ServletContext.log(): The server side 
> component of the HTTP Monitor has detected a 
> java.lang.StackOverflowError. This happens when there is an infinite 
> loop in the web module. Correct the cause of the infinite loop before 
> running the web module again. 
> 
> INFO: The server side component of the HTTP Monitor has detected a 
> java.lang.StackOverflowError. This happens when there is an infinite 
> loop in the web module. Correct the cause of the infinite loop before 
> running the web module again. WARNING: 
> StandardWrapperValve[AjaxServlet]: Servlet.service() for servlet 
> AjaxServlet threw exception java.lang.StackOverflowError 

> WARNING: StandardWrapperValve[AjaxServlet]: Servlet.service() for 
> servlet AjaxServlet threw exception java.lang.StackOverflowError at 
> sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:248) at 
> java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2276) 
> at 
> java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2248) 
> at java.util.Calendar.setTimeInMillis(Calendar.java:1140) at 
> java.util.Calendar.setTime(Calendar.java:1106) at 
> java.text.SimpleDateFormat.format(SimpleDateFormat.java:955) at 
> java.text.SimpleDateFormat.format(SimpleDateFormat.java:948) at 
> java.text.DateFormat.format(DateFormat.java:336) at 
> com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:90) 
> at 
> com.google.gson.internal.bind.DateTypeAdapter.write(DateTypeAdapter.java:41) 
> at 
> com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
> at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) at 
> com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
> at 
> com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
> at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) at 
> com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
> at 
> com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
> at 
> com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
> at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) 

;

DÜZENLEME: Personel sınıfı İşte

@Entity 
public class Staff implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "last_name") 
    private String lastName; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "first_name") 
    private String firstName; 
    @Size(max = 45) 
    @Column(name = "middle_name") 
    private String middleName; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 6) 
    @Column(name = "gender") 
    private String gender; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "date_of_birth") 
    @Temporal(TemporalType.DATE) 
    private Date dateOfBirth; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "nationality") 
    private String nationality; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "date_hired") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date dateHired; 
    @Size(max = 20) 
    @Column(name = "status") 
    private String status; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "staff") 
    private Collection<StaffApointments> staffApointmentsCollection; 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "staff") 
    private StaffContact staffContact; 
    @JoinColumn(name = "account_id", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private Account accountId; 
    @JoinColumn(name = "position_id", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private Position positionId; 

    public Staff() { 
    } 

    public Staff(Integer id) { 
     this.id = id; 
    } 

    public Staff(Integer id, String lastName, String firstName, String gender, Date dateOfBirth, String nationality, Date dateHired) { 
     this.id = id; 
     this.lastName = lastName; 
     this.firstName = firstName; 
     this.gender = gender; 
     this.dateOfBirth = dateOfBirth; 
     this.nationality = nationality; 
     this.dateHired = dateHired; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getMiddleName() { 
     return middleName; 
    } 

    public void setMiddleName(String middleName) { 
     this.middleName = middleName; 
    } 

    public String getGender() { 
     return gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 

    public Date getDateOfBirth() { 
     return dateOfBirth; 
    } 

    public void setDateOfBirth(Date dateOfBirth) { 
     this.dateOfBirth = dateOfBirth; 
    } 

    public String getNationality() { 
     return nationality; 
    } 

    public void setNationality(String nationality) { 
     this.nationality = nationality; 
    } 

    public Date getDateHired() { 
     return dateHired; 
    } 

    public void setDateHired(Date dateHired) { 
     this.dateHired = dateHired; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    @XmlTransient 
    public Collection<StaffApointments> getStaffApointmentsCollection() { 
     return staffApointmentsCollection; 
    } 

    public void setStaffApointmentsCollection(Collection<StaffApointments> staffApointmentsCollection) { 
     this.staffApointmentsCollection = staffApointmentsCollection; 
    } 

    public StaffContact getStaffContact() { 
     return staffContact; 
    } 

    public void setStaffContact(StaffContact staffContact) { 
     this.staffContact = staffContact; 
    } 

    public Account getAccountId() { 
     return accountId; 
    } 

    public void setAccountId(Account accountId) { 
     this.accountId = accountId; 
    } 

    public Position getPositionId() { 
     return positionId; 
    } 

    public void setPositionId(Position positionId) { 
     this.positionId = positionId; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Staff)) { 
      return false; 
     } 
     Staff other = (Staff) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "entity.Staff[ id=" + id + " ]"; 
    } 

} 

yanı pozisyonu sınıftır:

@Entity 
public class Position implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "name") 
    private String name; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "positionId") 
    private Collection<Staff> staffCollection; 

    public Position() { 
    } 

    public Position(Integer id) { 
     this.id = id; 
    } 

    public Position(Integer id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @XmlTransient 
    public Collection<Staff> getStaffCollection() { 
     return staffCollection; 
    } 

    public void setStaffCollection(Collection<Staff> staffCollection) { 
     this.staffCollection = staffCollection; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Position)) { 
      return false; 
     } 
     Position other = (Position) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "entity.Position[ id=" + id + " ]"; 
    } 

} 

DÜZENLEME 2:

ben ayrıntılarda @expose eklendi staffcollection haricinde personel sınıfım. Ama hala 1 problemim var. Her seferinde, açılır menüdeki 1. değer (value = 1) seçildiğinde, sonsuz döngü hatası verir. Biri bana yardım edebilir mi?

DÜZENLEME 3:

it Sabit! Son GsonBuilder builder = new GsonBuilder(); builder.excludeFieldsWithoutExposeAnnotation(); bir bütün olarak. asla durmayacak çünkü artık sorun her Staff nesne her tekrar bir CollectionStaff ait nesneleri içerir bir CollectionStaff nesneleri içeren bir pozisyonu nesnesi içerir olmasıdır

+0

Servlet bana Java gibi sesler ve hatalarınız bu düşünceyi doğrulamak için ... belki bir java etiketi kullanmak faydalı olabilir? –

+0

Burada kullanılan "Toplama personeliKoleksiyon" gibi Ham türü kullanmayın, daha sonra herhangi bir kontrol olmadan genel "List" e dönüştürülür. * Bu, dairesel bir referansa sahipseniz muhtemelen gerçekleşir. * Ayrıştırma sırasında sonsuz döngü ile sonuçlanır. 'Posiiton' ve 'Staff' sınıflarını da paylaşın. – Braj

+0

@Braj Sınıflarım, veritabanından varlık sınıfları olarak oluşturulur. "Personel" tablosu, position_id öğesini "Konum" tablosundan alır. Size açık bir şekilde anlayamıyorumsa, personel toplama işlemine referans gösterdiğinizde, ne yapmamı önerirsiniz? – MLDS

cevap

7

işleri vb GSON sonsuza bu ağacı yürüyüş devam edecek .

Bunu çözmek için this sorusunun yanıtlarına bakabilirsiniz.

+0

Beni yönlendirdiğiniz için teşekkür ederiz. Neyi açığa çıkaracağımı anlamakta biraz zorlanıyorum. Pozisyon sınıfını personel sınıfında mı göstermeliyim? Hala bana hata veriyor. Lütfen açıklar mısın? – MLDS

+0

Hayır JSON –

+0

'nizde istemediğinizler dışındaki tüm öğeleri açığa çıkarmanız gerekir CRUD işlemlerimi etkiler mi? – MLDS