嗨,我遇到了杰克逊解串器的问题。
我有两个弹簧启动应用程序和一个用于共享模型的单独模块。
app1-> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>eu.emif.security</groupId>
<artifactId>model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
app2-> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>eu.emif.security</groupId>
<artifactId>model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
model-> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
在模型中我有一个用户和角色对象
package eu.emif.security.model;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.annotate.JsonProperty;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Entity
@Table(name = "user", schema = "public")
@JsonAutoDetect(value = JsonMethod.NONE)
public class User implements Serializable, UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonProperty
private Long id;
@NotNull
@JsonProperty
private String username;
@NotNull
private String password;
@ManyToMany(fetch = FetchType.EAGER,mappedBy = "users")
@JsonIgnore
private List<Role> roles;
public User() { }
@JsonIgnore
public Collection<? extends GrantedAuthority> getAuthorities() {
ArrayList<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
for (Role role : roles) {
grantedAuthorities.add(new SimpleGrantedAuthority(role.getRoleName()));
}
return grantedAuthorities;
}
public boolean isAccountNonExpired() {
return true;
}
public boolean isAccountNonLocked() {
return true;
}
public boolean isCredentialsNonExpired() {
return true;
}
public boolean isEnabled() {
return true;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public Long getId() {
return id;
}
}
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.annotate.JsonProperty;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
@Table(name = "role", schema = "public")
@JsonAutoDetect(value = JsonMethod.NONE)
public class Role implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonProperty
private Long id;
@ManyToMany
@JoinTable(name="user_roles", joinColumns=@JoinColumn(name="role_id"), inverseJoinColumns=@JoinColumn(name="user_id"))
@JsonIgnore
private List<User> users;
public Role() {
}
@JsonProperty
private String roleName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
问题是,当我运行我的应用程序时,我得到一个堆栈溢出异常,因为当用户对象被序列化时,jackson然后尝试序列化角色,而这些角色反过来又有用户和无限循环。
我相信@JsonIgnore注释被忽略(没有双关语)
你们中有谁知道为什么会这样吗?
他们是一种在春季启动时告诉杰克逊的方式,它需要寻找带杰克逊注释注释的课程。我相信app1中的映射器根本不知道它们是单独模块中的类,这些类是注释的。 亲切的问候
答案 0 :(得分:2)
从您的pom.xml看起来您正在使用Jackson 2.x,但注释来自旧杰克逊(1.xx)。您可以尝试以下方法:
更改
import org.codehaus.jackson.annotate.JsonIgnore;
到
import org.fasterxml.jackson.annotate.JsonIgnore;