2016-11-25 6 views
-1

Ich habe nach dieser Ausnahme gesucht. Die meisten Antworten schlagen vor, Daten direkt oder indirekt eifrig zu holen. Ich möchte die Kinddaten nicht. Wie kann ich dem JSON-Mapping mitteilen, dass nur die übergeordneten Daten zurückgegeben werden und nicht nach den untergeordneten Daten gesucht wird? Hiercom.fasterxml.jackson.databind.JsonMappingException: Fehler beim Initialisieren einer Sammlung von Rollen

ist die Methode, in der Steuerung:

@RequestMapping(value="/user/{id}", method = RequestMethod.GET) 
public @ResponseBody User getUserById(@PathVariable("id") Integer id) { 
    User user = userService.getUserById(id); 
    return user; 
} 

DAO hat die folgende Methode. Beachten Sie, dass Hibernate.initialize() keinen Unterschied in der Ausgabe brachte. Der println kann den Benutzernamen ausdrucken.

public User getUserById(int id) { 
    User user = hibernateTemplate.get(User.class, id); 
    System.out.println("hello " + user.getUserName()); 
    Hibernate.initialize(user); 
    return user; 
} 

WebAppInitializer hat diesen Filter

@Override 
protected Filter[] getServletFilters() { 

    return new Filter[]{ new OpenEntityManagerInViewFilter() }; 
} 

User.java:

import java.util.Date; 
import java.util.HashSet; 
import java.util.Set; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.UniqueConstraint; 

@Entity 
@Table(name = "tm_user", catalog = "tm", uniqueConstraints = {  @UniqueConstraint(columnNames = "email"), 
    @UniqueConstraint(columnNames = "phone") }) 
public class User implements java.io.Serializable { 

private Integer userId; 
private String userName; 
private String phone; 
private String email; 
private String password; 
private Date dateOfBirth; 
private String userNotes; 
private Set<AttendanceUser> attendanceUsers = new HashSet<AttendanceUser>(0); 
private Set<ProjectUser> projectUsers = new HashSet<ProjectUser>(0); 
private Set<RoleUser> roleUsers = new HashSet<RoleUser>(0); 

public User() { 
} 

public User(String userName) { 
    this.userName = userName; 
} 

public User(String userName, String phone, String email, String password, Date dateOfBirth, String userNotes, 
     Set<AttendanceUser> attendanceUsers, Set<ProjectUser> projectUsers, Set<RoleUser> roleUsers) { 
    this.userName = userName; 
    this.phone = phone; 
    this.email = email; 
    this.password = password; 
    this.dateOfBirth = dateOfBirth; 
    this.userNotes = userNotes; 
    this.attendanceUsers = attendanceUsers; 
    this.projectUsers = projectUsers; 
    this.roleUsers = roleUsers; 
} 

@Id 
@GeneratedValue(strategy = IDENTITY) 

@Column(name = "user_id", unique = true, nullable = false) 
public Integer getUserId() { 
    return this.userId; 
} 

public void setUserId(Integer userId) { 
    this.userId = userId; 
} 

@Column(name = "user_name", nullable = false, length = 200) 
public String getUserName() { 
    return this.userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

@Column(name = "phone", unique = true, length = 30) 
public String getPhone() { 
    return this.phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

@Column(name = "email", unique = true, length = 100) 
public String getEmail() { 
    return this.email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

@Column(name = "password", length = 50) 
public String getPassword() { 
    return this.password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

@Temporal(TemporalType.DATE) 
@Column(name = "date_of_birth", length = 10) 
public Date getDateOfBirth() { 
    return this.dateOfBirth; 
} 

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

@Column(name = "user_notes", length = 4000) 
public String getUserNotes() { 
    return this.userNotes; 
} 

public void setUserNotes(String userNotes) { 
    this.userNotes = userNotes; 
} 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
public Set<AttendanceUser> getAttendanceUsers() { 
    return this.attendanceUsers; 
} 

public void setAttendanceUsers(Set<AttendanceUser> attendanceUsers) { 
    this.attendanceUsers = attendanceUsers; 
} 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
public Set<ProjectUser> getProjectUsers() { 
    return this.projectUsers; 
} 

public void setProjectUsers(Set<ProjectUser> projectUsers) { 
    this.projectUsers = projectUsers; 
} 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
public Set<RoleUser> getRoleUsers() { 
    return this.roleUsers; 
} 

public void setRoleUsers(Set<RoleUser> roleUsers) { 
    this.roleUsers = roleUsers; 
} 

} 

Jede Hilfe sehr geschätzt wird.

+0

zeigen Sie Ihre 'User.java' pleaz –

+0

@MohamedNabli, ich hatte die User.java hinzugefügt. Lass es mich wissen, wenn du etwas falsch siehst. –

Antwort

0

Dank Bhashit serialisiert werden. Diese beiden Links haben geholfen, das Problem zu beheben.

Ich musste Filter in WebAppInitializer ersetzen. Anstelle des jpa-Filters habe ich den Hibernate-Filter geändert.

//  return new Filter[]{ new OpenEntityManagerInViewFilter() }; 
    return new Filter[]{ new OpenSessionInViewFilter() }; 
0

Sie können eine der folgenden zwei Dinge tun, wenn Sie die roleUsers Sammlung laden nicht wollen:

hinzufügen @JsonIgnoreProperties({"roleUsers"}) an der Spitze der Klasse. Für Beispiel

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
@JsonIgnoreProperties({"roleUsers"}) 
class User { ... 

Der Import muss möglicherweise abhängig von der verwendeten Version geändert werden. Dies wird Jackson sagen, diese Eigenschaft während der Serialisierung zu ignorieren. Es gibt verschiedene Möglichkeiten, Eigenschaften mit Jackson zu ignorieren. Für einige Beispiele, werfen Sie einen Blick auf this blog. Eine andere Quelle könnte this SO post sein, die Ihnen sagt, wie Sie eine Eigenschaft ignorieren, wenn Sie keine Kontrolle über den Quellcode der Klasse haben.

Oder können Sie eine Art von DTO erstellen oder eine Map nur die Eigenschaften enthält, die Sie serialisieren müssen, und verwenden jackson dann eine Instanz dieses DTO oder Map

+0

Danke, lass mich durch die zwei Links gehen, die du gabst. –

+0

Ich möchte nicht User.java ändern, wie es automatisch generiert wird. Haben Sie einen Link für die zweite Methode (jackson serlizing DTO oder Map) –

Verwandte Themen