こんにちは、私は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倍であった。私は私の春のブートの設定をエンティティとコンポーネントに私の他のモジュールをスキャンして、依存関係をcodehauseの代わりにfasterxmlに変更するように指示しなければならなかった。ありがとうございました –