2017-12-03 3 views
0

Usuario와 Entrada의 두 가지 Java 클래스가 있습니다. 나는 봄의 데이터를 사용하고Spring @JsonIgnore 직렬화가 예상대로 작동하지 않습니다.

@Entity 
@Table(name="evento") 
@NamedQuery(name="Evento.findAll", query="SELECT e FROM Evento e") 
public class Evento implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int idevento; 

    private String categoria; 

    private String descripcion; 

    @Column(name="entradas_disponibles") 
    private int entradasDisponibles; 

    @Column(name="entradas_venta") 
    private int entradasVenta; 

    private int estado; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name="fecha_hora") 
    private Date fechaHora; 

    private String imagen; 

    private String localizacion; 

    @Column(name="precio_entrada") 
    private double precioEntrada; 

    private String titulo; 

    //bi-directional many-to-one association to CompraEntrada 
    @OneToMany(mappedBy="eventoBean") 
    private List<CompraEntrada> compraEntradas; 

    //bi-directional many-to-one association to Entrada 
    @OneToMany(mappedBy="eventoBean") 
    private List<Entrada> entradas; 

    //bi-directional many-to-one association to Usuario 
    @ManyToOne 
    @JoinColumn(name="creador") 
    private Usuario usuario; 

하지만 재귀 직렬화 문제가 :

사용자 선호도 :

@Entity 
@Table(name="usuario") 
@NamedQuery(name="Usuario.findAll", query="SELECT u FROM Usuario u") 
public class Usuario implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int idusuario; 

    private String apellido1; 

    private String apellido2; 

    private String email; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name="fecha_alta") 
    private Date fechaAlta; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name="fecha_baja") 
    private Date fechaBaja; 

    @Column(name="is_admin") 
    private boolean isAdmin; 

    private String nombre; 

    private String password; 

    //bi-directional many-to-one association to CompraEntrada 
    @OneToMany(mappedBy="usuarioBean") 
    @JsonIgnore 
    private List<CompraEntrada> compraEntradas; 

    //bi-directional many-to-one association to Entrada 
    @OneToMany(mappedBy="usuarioBean") 
    private List<Entrada> entradas; 

    //bi-directional many-to-one association to Evento 
    @OneToMany(mappedBy="usuario") 
    @JsonIgnore 
    private List<Evento> eventos; 

    //bi-directional many-to-one association to Mensaje 
    @OneToMany(mappedBy="emisor") 
    @JsonIgnore 
    private List<Mensaje> mensajesEmitidos; 

    //bi-directional many-to-one association to Mensaje 
    @OneToMany(mappedBy="receptor") 
    @JsonIgnore 
    private List<Mensaje> mensajesRecibidos; 

재치 :

@Entity 
@Table(name="entrada") 
@NamedQuery(name="Entrada.findAll", query="SELECT e FROM Entrada e") 
public class Entrada implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int identrada; 

    //bi-directional many-to-one association to Evento 
    @ManyToOne 
    @JoinColumn(name="evento") 
    private Evento eventoBean; 

    //bi-directional many-to-one association to Usuario 
    @ManyToOne 
    @JoinColumn(name="usuario") 
    @JsonIgnore 
    private Usuario usuarioBean; 

는 또한 클래스 Evento 있습니다. Usuario 유형의 객체를 "인쇄"할 때 Usuario의 모든 정보를 직렬화해야합니다. 여기서 핵심은 Entrada (Usuario의 List)는 Usuario 유형의 속성을 가지고 있다는 것입니다.

나는 Entrada의 Usuario를 직렬화하고 싶지 않다. Usuario의 List에있는 각 항목을 직렬화하려고합니다.

Entrada에서 Usuario 유형의 속성에 @JsonIgnore를 추가하려고했지만 여전히 동일한 문제가 있습니다.

로그 쇼 :

2017-12-04 18:57:46.980[0;39m [31mERROR[0;39m [35m3389[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: es.softcorp.domains.Entrada["eventoBean"]->es.softcorp.domains.Evento["entradas"]->org.hibernate.collection.internal.PersistentBag[0]->es.softcorp.domains.Entrada["eventoBean"]->es.softcorp.domains.Evento["entradas"]->org.hibernate.collection.internal.PersistentBag[0]->es.softcorp.domains.Entrada["eventoBean"]->es.softcorp.domains.Evento["entradas"]- 

+1

이 링크 http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion 도움이 될 수 있습니다. – Zeronex

+0

'print'는 무엇을 의미합니까? – Jaiwo99

+0

더 많은 예외 로그와'Evento' 클래스를 제공 할 수 있습니까? –

답변

1

에 내가 @JsonIgnore 기억할 수있는에서이를 해결 한 당신이 원하는 경우 해당 클래스에 대한 자동 필드 감지 기능을 비활성화하거나 작동하도록 모든 수업.

재귀 문제를 해결할 수있는 두 가지 방법이 있습니다.

  1. ObjectMapper에 양방향 관계를 알리는 Json 주석.
  2. @JsonIgnore, @JsonView 재귀/루프를 일으키는 필드입니다. 나는이 같은 모든 클래스에 대한 비활성화 자동 필드 감지를하고 난에는 직렬화하고 싶었 클래스에 @JsonProperty@JsonIgnore을 사용하는 샘플 프로젝트에 대한

. 자동 감지가 비활성화 된 경우 수동으로 필드를 표시해야합니다.

/** 
* Disable auto field detection for JSON message converter. 
* @return 
*/ 
@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 
    ObjectMapper objectMapper = new ObjectMapper(); 

    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

    objectMapper.setVisibility(
      objectMapper 
      .getVisibilityChecker() 
      .with(Visibility.NONE) 
    ); 

    jsonConverter.setObjectMapper(objectMapper); 
    return jsonConverter; 
} 

직렬화 얻을 것이다 필드 @JsonIgnore 비슷한 일을 선택하는 데 사용할 수 있습니다 @JsonView 주석도 있습니다, 여기에 더 문제가있다 해결하기 위해 https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring

올바른 방법을 읽기위한 링크입니다 요약 페이지 http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

에 설명 된대로이 아이 @JsonManagedReference를 사용 (비 소유 측)과 부모에 @JsonBackReference을 사용하는 재귀/양방향 관계에 대한 ObjectMapper에게 (relati의 측면을 소유 에).

관련 문제