2016-07-12 47 views
0

嗨我有一個傑克遜解串器問題。傑克遜收集串行器錯誤儘管@JsonIgnore

我有兩個spring引導應用程序和一個單獨的模塊用於共享模型。

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", [email protected](name="role_id"), [email protected](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; 


} 
} 

的問題是,當我運行我的應用程序,我得到一個堆棧溢出異常,因爲當用戶對象序列化傑克遜然後嘗試序列化具有用戶和無限循環的角色。

我相信@JsonIgnore註釋被忽略(沒有雙關語意)

是否有人對你有一個想法,爲什麼這是發生?

是他們在春季啓動需要的地方尋找這些註釋至極傑克遜註釋班告訴傑克遜的一種方式。我相信app1中的映射器根本不知道它們是在單獨模塊中註釋的類。 親切的問候

回答

2

從你的pom.xml似乎你正在使用傑克遜2.x的,但註釋是從舊傑克遜(1.XX)。你可以請嘗試以下方法:

變化

import org.codehaus.jackson.annotate.JsonIgnore; 

import org.fasterxml.jackson.annotate.JsonIgnore; 
+1

謝謝你的工作。解決方案是兩倍。我必須告訴我的Spring啓動配置實體和組件掃描我的其他模塊,然後將依賴關係更改爲fasterxml而不是codehause。謝謝 –