2016-07-12 11 views
0

Hallo Ich habe ein Problem mit dem Jacksons Deserializer.Jackson Sammlung Serializer Fehler trotz @JsonIgnore

Ich habe zwei Spring-Boot-Anwendungen und ein separates Modul für das gemeinsame Modell.

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> 

im Modell ich ein Benutzer- und Rollen bezwecken

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; 


} 
} 

Das Problem ist, dass, wenn ich meine Anwendung ausführen ich einen Stapelüberlauf Ausnahme erhalten, weil, wenn das Objekt Benutzer serialisiert wird jackson dann versucht, Serialisieren Sie die Rollen, die wiederum Benutzer und Endlosschleifen haben.

Ich glaube, die @JsonIgnore Anmerkung (kein Wortspiel beabsichtigt)

Hat jemand von euch eine Idee haben, ignoriert wird, warum diese auftreten wird?

Ist eine Art, Jackson im Frühjahr Boot zu sagen, wo es nach Klassen suchen muss, die mit Jacksons Anmerkungen kommentiert sind. Ich glaube, dass der Mapper in app1 einfach keine Ahnung hat, dass es Klassen im separaten Modul sind, die kommentiert sind. Mit freundlichen Grüßen

Antwort

2

Von Ihrer pom.xml scheint es, dass Sie Jackson 2.x verwenden, aber die Anmerkungen stammen vom alten Jackson (1.xx).

ändern

import org.codehaus.jackson.annotate.JsonIgnore; 

zu

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

danke dir, dass gearbeitet: Könnten Sie bitte die folgenden versuchen. Die Lösung war zweifach. Ich musste meine Spring-Boot-Konfiguration zu Entity und Komponente mein anderes Modul scannen und dann die Abhängigkeit zu Fasterxml anstelle von Codehaus ändern. Danke –

Verwandte Themen