2016-07-12 5 views
0

こんにちは、私はjacksonデシリアライザに問題があります。@JsonIgnoreにもかかわらずJacksonコレクションのシリアライザエラー

私は2つのスプリングブートアプリケーションと、共有モデル用の別個のモジュールを持っています。私は、ユーザーおよびロールオブジェクトを持つモデル

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; 


} 
} 

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> 

問題は、私は自分のアプリケーションを実行すると、ユーザーオブジェクトがシリアライズされるときジャクソンが、その後にしようとするので、私は、スタックオーバーフロー例外を取得するということですユーザーと無限ループを持つロールをシリアル化します。

私はあなたの誰もが、これが発生している理由のアイデアを持っています(何もしゃれが意図していない)

@JsonIgnoreアノテーションは無視されます信じますか?

ジャックソン注釈と注釈が付けられているクラスを探す必要がある、春のブート時にジャクソンに伝える方法です。私はapp1のマッパーは、彼らが注釈されている別個のモジュールのクラスであることを単に知らないと信じています。 種類:

答えて

2

pom.xmlから、あなたはJackson 2.xを使用しているようですが、注釈は古いJackson(1.xx)のものです。あなたは次のことを試してみてくださいでした:

import org.fasterxml.jackson.annotate.JsonIgnore; 

変更

import org.codehaus.jackson.annotate.JsonIgnore; 

+1

が働いているあなたに感謝します。溶液は2倍であった。私は私の春のブートの設定をエンティティとコンポーネントに私の他のモジュールをスキャンして、依存関係をcodehauseの代わりにfasterxmlに変更するように指示しなければならなかった。ありがとうございました –

関連する問題