2015-12-22 2 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> ролей в классе User), и преобразует его в формат хранения JSON-подобный; это так называемый процесс сортировки . Затем Джексон ищет заднюю часть ссылки (т. Е. List<User> пользователей в классе Role) и оставляет ее как она , а не сериализует ее. Эта часть отношения будет , реконструированной во время десериализации (разборки) справочной информации .

Решение:

  1. Добавьте @JsonManagedReference В передней части соотношения (т.е. Users.java класса):

  2. Добавьте @JsonBackReference В задней части отношений (т.е.Role.java и Groups.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 и посмотреть, что происходит в вашего кода.

Надеюсь, это поможет.

Смежные вопросы