2015-12-22 79 views
1

我想送从Spring MVC的控制器,JSP页面的响应,我得到了一个异常异常而从控制器发送响应JSP页面

首先,我试图返回一个列表,以JSP页面

对于列表代码:

@RequestMapping(value = "/Users", method = RequestMethod.POST) 
@ResponseBody 
public List<Users> getUsers(@RequestParam(value = "intermediate" ,required = false) String intermediate)throws java.text.ParseException{ 
    List<Users> list = null; 

    int intermediateSelection = Integer.parseInt(intermediate); 

    list = getUsersBySelection(IntermediateSelection) //This will return list of users 

    return list; 
    } 

然后我试图一个JSONObject返回JSP页面

代码的JSONObject:

@RequestMapping(value = "/Users", method = RequestMethod.POST) 
@ResponseBody 
public JSONObject getUsers(@RequestParam(value = "intermediate" ,required = false) String intermediate) throws java.text.ParseException{ 
    List<Users> list = null; 

    int IntermediateSelection = Integer.parseInt(intermediate); 

    list = getUsersBySelection(IntermediateSelection); //This will return list of users 

    Iterator<Users> iterator=list.iterator(); 

    JSONObject UsersJSON = new JSONObject(); 
    JSONArray usersArray = new JSONArray(); 

    while (iterator.hasNext()) { 
     Users users = iterator.next(); 

     JSONObject object = new JSONObject(); 
     object.put("Id", users.getUserId()); 
     object.put("Name", users.getUserName()); 
     object.put("Group", users.getGroup()); 

     usersArray.add(object); 
    } 

    UsersJSON.put("users", usersArray); 

    //System.out.println(UsersJSON.toString()); 

    return UsersJSON; 
    } 

他们既没有为我工作。我有这样的例外。

org.apache.catalina.core.StandardWrapperValve invoke 
java.lang.StackOverflowError 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2918) 
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174) 
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669) 
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:682) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:132) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:94) 
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:156) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:575) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:666) 

用户POJO的:

@Entity 
@Table(name = "Users") 
public class Users implements java.io.Serializable { 

    private int userId; 
    private Role role; 
    private Groups groupId; 
    private UserType userType; 
    private String userName; 
    private String password; 
    private Boolean isActive; 

    public Users() { 
    } 

    public Users(int userId, Role role, Groups groupId ,UserType userType, String userName, String password, boolean isActive) { 
     this.userId = userId; 
     this.role = role; 
     this.groupId = groupId; 
     this.userType = userType; 
     this.userName = userName; 
     this.password = password; 
     this.isActive = isActive; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "UserID", unique = true, nullable = false) 
    public int getUserId() { 
     return this.userId; 
    } 

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

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "RoleID", nullable = false) 
    public Role getRole() { 
     return this.role; 
    } 

    public void setRole(Role role) { 
     this.role = role; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "GroupId", nullable = false) 
    public Groups getGroup() { 
     return this.groupId; 
    } 

    public void setGroup(Groups group) { 
     this.groupId = group; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "UserTypeID", nullable = false) 
    public UserType getUserType() { 
     return this.userType; 
    } 

    public void setUserType(UserType userType) { 
     this.userType = userType; 
    } 

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

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

    @Column(name = "Password", nullable = false) 
    public String getPassword() { 
     return this.password; 
    } 

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

    @Column(name = "IsActive", nullable = false, columnDefinition = "BIT") 
    public Boolean isIsActive() { 
     return this.isActive; 
    } 

    public void setIsActive(Boolean isActive) { 
     this.isActive = isActive; 
    } 
} 
+0

你可以发布'Users.java'类吗?你在那个班有什么关系吗? – Lucky

+0

查看编辑后的代码.. – Dev

回答

5

this blog post

为杰克逊工作得很好,这种关系 的双方一个不应该被序列化,以避免令人烦恼的无限循环,导致我们的StackOverflow错误。

所以,杰克逊为基准的前部,例如一个Java类(即,在用户类别List<Role>角色)的 属性, 转换它在一个类JSON存储格式;这就是所谓的 编组过程。然后,杰克逊寻找 参考文献的后半部分(即Role类中的List<User>个用户),并将其保留为 ,而不是序列化它。这部分关系将在 前向引用的反序列化(取消编组)期间重新构建。

解决方案:

  1. 添加@JsonManagedReference在关系(即Users.java类)的前部:

  2. 添加@JsonBackReference在关系的后部(即Role.javaGroups.java类):

Users.java(例如代码):

@Entity 
public class Users implements java.io.Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "UserID", unique = true, nullable = false) 

@Column(name="name") 
private String name; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "RoleID", nullable = false) 
@JsonManagedReference 
public Role getRole() { 
    return this.role; 
} 

... 

Role.java(example code)

@Entity 
public class Role implements java.io.Serializable { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id; 

@OneToMany 
@JsonBackReference 
private Set<User> users = new HashSet<User>(); 

... 

和以同样的方式也适用于

Groups.java

@Entity 
public class Groups implements java.io.Serializable { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id; 

@ManyToMany(mappedBy="groups") 
@JsonBackReference 
private Set<User> users = new HashSet<User>(); 

... 

你可以检查另一个有用的注释是@JsonIdentityInfo:使用 它,每次杰克逊序列化你的对象,这将增加一个ID(或 另一个属性的选择)它,所以它不会完全 “扫描”它每次。当您在更多相互关联的对象(例如:Order -> OrderLine -> User -> Order和之后)之间有一个连锁 循环时,这可能会很有用。

在这种情况下,你必须要小心,因为你可能会需要(与共享同一卖方更多的产品例如在产品 列表)不止一次阅读 你对象的属性,这 注释阻止你这样做。我建议始终查看 firebug日志以检查JSON响应,并查看 代码中发生了什么。

希望这会有所帮助。

相关问题