遇到最大的弹簧问题

时间:2016-06-21 15:46:46

标签: spring spring-data-rest

我在API上使用Spring Boot作为数据库和mysql表示法(下面的代码)运行@datarest来生成Dao's

我有一个结构(estructura),它有多个步骤(pasos)和一个expediente(存档或文件),它有一个estructura关联,必须满足多个pasos。

    @Entity
    @Table(name="expedientexpaso")
    public class ExpedientePaso implements Serializable{

        private static final long serialVersionUID = 1L;
        @EmbeddedId
        private ExpedientePasoPK id;
        @RestResource(exported=false)
        @ManyToOne(fetch = FetchType.EAGER, targetEntity = Expediente.class,optional=true, cascade=CascadeType.MERGE)
        @JoinColumns(value = {
                @JoinColumn(name = "expediente", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)})
        private Expediente expediente;
        @RestResource(exported=false)
        @ManyToOne(fetch = FetchType.EAGER, targetEntity = Paso.class,optional=true, cascade=CascadeType.MERGE)
        @JoinColumns(value = {
                @JoinColumn(name = "paso", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)})
        private Paso paso;
        @Column(name="completo")
        private Boolean completo;
        @Column(name="fecha_completa")
        private Date fechaCompleta;
        @JsonIgnore
        @Column(name = "fecha_carga")
        private Date fechaCarga;
        @JsonIgnore
        @Column(name = "fecha_mod")
        private Date fechaMod;
        @JsonIgnore
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_carga", referencedColumnName = "id")
        private Usuario usuarioCarga;
        @JsonIgnore
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_mod", referencedColumnName = "id")
        private Usuario usuarioMod;
        public ExpedientePasoPK getId() {
            return id;
        }
        public void setId(ExpedientePasoPK id) {
            this.id = id;
        }
        public Expediente getExpediente() {
            return expediente;
        }
        public void setExpediente(Expediente expediente) {
            this.expediente = expediente;
        }
        public Paso getPaso() {
            return paso;
        }
        public void setPaso(Paso paso) {
            this.paso = paso;
        }
        public Boolean getCompleto() {
            return completo;
        }
        public void setCompleto(Boolean completo) {
            this.completo = completo;
        }
        public Date getFechaCompleta() {
            return fechaCompleta;
        }
        public void setFechaCompleta(Date fechaCompleta) {
            this.fechaCompleta = fechaCompleta;
        }
        public Date getFechaCarga() {
            return fechaCarga;
        }
        public void setFechaCarga(Date fechaCarga) {
            this.fechaCarga = fechaCarga;
        }
        public Date getFechaMod() {
            return fechaMod;
        }
        public void setFechaMod(Date fechaMod) {
            this.fechaMod = fechaMod;
        }
        public Usuario getUsuarioCarga() {
            return usuarioCarga;
        }
        public void setUsuarioCarga(Usuario usuarioCarga) {
            this.usuarioCarga = usuarioCarga;
        }
        public Usuario getUsuarioMod() {
            return usuarioMod;
        }
        public void setUsuarioMod(Usuario usuarioMod) {
            this.usuarioMod = usuarioMod;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((completo == null) ? 0 : completo.hashCode());
            result = prime * result + ((fechaCompleta == null) ? 0 : fechaCompleta.hashCode());
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            ExpedientePaso other = (ExpedientePaso) obj;
            if (completo == null) {
                if (other.completo != null)
                    return false;
            } else if (!completo.equals(other.completo))
                return false;
            if (fechaCompleta == null) {
                if (other.fechaCompleta != null)
                    return false;
            } else if (!fechaCompleta.equals(other.fechaCompleta))
                return false;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            return true;
        }

    }

Theres是给我错误的类,这里是链接的类,首先是expediente类

    @Entity
    @Table(name = "expediente")
    public class Expediente implements Serializable {

        private static final long serialVersionUID = 1L;
        @Id
        @JsonIgnore
        @JsonBackReference
        @GeneratedValue
        @Column(name = "id")
        private Long id;
        @Column(name = "numero_expediente")
        private String numeroExpediente;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "beneficiario", referencedColumnName = "id")
        private Beneficiario beneficiario;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "estructura", referencedColumnName = "id")
        private Estructura estructura;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "franquicia", referencedColumnName = "id")
        private Franquicia franquicia;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "solicitud", referencedColumnName = "id")
        private Solicitud solicitud;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "disposicion", referencedColumnName = "id")
        private Disposicion disposicion;
        @Column(name = "fecha_carga")
        private Date fechaCarga;
        @Column(name = "fecha_mod")
        private Date fechaMod;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_carga", referencedColumnName = "id")
        private Usuario usuarioCarga;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_mod", referencedColumnName = "id")
        private Usuario usuarioMod;
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "expediente",cascade=CascadeType.ALL)
        @RestResource(exported=false)
        private Set<ExpedientePaso> expedientePasos = new HashSet<ExpedientePaso>();

        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public Beneficiario getBeneficiario() {
            return beneficiario;
        }
        public String getNumeroExpediente() {
            return numeroExpediente;
        }
        public void setNumeroExpediente(String numeroExpediente) {
            this.numeroExpediente = numeroExpediente;
        }
        public void setBeneficiario(Beneficiario beneficiario) {
            this.beneficiario = beneficiario;
        }
        public Estructura getEstructura() {
            return estructura;
        }
        public void setEstructura(Estructura estructura) {
            this.estructura = estructura;
        }
        public Franquicia getFranquicia() {
            return franquicia;
        }
        public void setFranquicia(Franquicia franquicia) {
            this.franquicia = franquicia;
        }
        public Solicitud getSolicitud() {
            return solicitud;
        }
        public void setSolicitud(Solicitud solicitud) {
            this.solicitud = solicitud;
        }
        public Date getFechaCarga() {
            return fechaCarga;
        }
        public void setFechaCarga(Date fechaCarga) {
            this.fechaCarga = fechaCarga;
        }
        public Date getFechaMod() {
            return fechaMod;
        }
        public void setFechaMod(Date fechaMod) {
            this.fechaMod = fechaMod;
        }
        public Usuario getUsuarioCarga() {
            return usuarioCarga;
        }
        public void setUsuarioCarga(Usuario usuarioCarga) {
            this.usuarioCarga = usuarioCarga;
        }
        public Usuario getUsuarioMod() {
            return usuarioMod;
        }
        public void setUsuarioMod(Usuario usuarioMod) {
            this.usuarioMod = usuarioMod;
        }
        public Disposicion getDisposicion() {
            return disposicion;
        }
        public void setDisposicion(Disposicion disposicion) {
            this.disposicion = disposicion;
        }
        public Set<ExpedientePaso> getExpedientePasos() {
            return expedientePasos;
        }
        public void setExpedientePasos(Set<ExpedientePaso> expedientePasos) {
            this.expedientePasos = expedientePasos;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((numeroExpediente == null) ? 0 : numeroExpediente.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Expediente other = (Expediente) obj;
            if (numeroExpediente == null) {
                if (other.numeroExpediente != null)
                    return false;
            } else if (!numeroExpediente.equals(other.numeroExpediente))
                return false;
            return true;
        }

    }

这是paso课程:

    @Entity
    @Table(name = "paso")
    public class Paso implements Serializable {

        private static final long serialVersionUID = 1L;
        @Id
        @JsonIgnore
        @JsonBackReference
        @GeneratedValue
        @Column(name = "id")
        private Long id;
        @Column(name = "paso")
        private Integer paso;
        @JsonBackReference
        @RestResource(exported=true)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "estructura", referencedColumnName = "id")
        private Estructura estructura;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "tarea", referencedColumnName = "id")
        private Tarea tarea;
        /*
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "documentacion", referencedColumnName = "id")
        private Documentacion documentacion;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "seguimiento", referencedColumnName = "id")
        private Seguimiento seguimiento;
        */
        @JsonIgnore
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "vigencia", referencedColumnName = "id")
        private Vigencia vigencia;
        @JsonIgnore
        @Column(name = "fecha_carga")
        private Date fechaCarga;
        @JsonIgnore
        @Column(name = "fecha_mod")
        private Date fechaMod;
        @JsonIgnore
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_carga", referencedColumnName = "id")
        private Usuario usuarioCarga;
        @JsonIgnore
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_mod", referencedColumnName = "id")
        private Usuario usuarioMod;

        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public Integer getPaso() {
            return paso;
        }
        public void setPaso(Integer paso) {
            this.paso = paso;
        }
        public Tarea getTarea() {
            return tarea;
        }
        public void setTarea(Tarea tarea) {
            this.tarea = tarea;
        }
        public Vigencia getVigencia() {
            return vigencia;
        }
        public void setVigencia(Vigencia vigencia) {
            this.vigencia = vigencia;
        }
        public Date getFechaCarga() {
            return fechaCarga;
        }
        public void setFechaCarga(Date fechaCarga) {
            this.fechaCarga = fechaCarga;
        }
        public Date getFechaMod() {
            return fechaMod;
        }
        public void setFechaMod(Date fechaMod) {
            this.fechaMod = fechaMod;
        }
        public Usuario getUsuarioCarga() {
            return usuarioCarga;
        }
        public void setUsuarioCarga(Usuario usuarioCarga) {
            this.usuarioCarga = usuarioCarga;
        }
        public Usuario getUsuarioMod() {
            return usuarioMod;
        }
        public void setUsuarioMod(Usuario usuarioMod) {
            this.usuarioMod = usuarioMod;
        }
        public Estructura getEstructura() {
            return estructura;
        }
        public void setEstructura(Estructura estructura) {
            this.estructura = estructura;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            result = prime * result + ((vigencia == null) ? 0 : vigencia.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Paso other = (Paso) obj;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            if (vigencia == null) {
                if (other.vigencia != null)
                    return false;
            } else if (!vigencia.equals(other.vigencia))
                return false;
            return true;
        }

    }

最后这里是estructura类:

    @Entity
    @Table(name = "estructura")
    public class Estructura implements Serializable {

        private static final long serialVersionUID = 1L;
        @Id
        @JsonIgnore
        @GeneratedValue
        @Column(name = "id")
        private Long id;
        @Column(name = "estructura")
        private String estructura;
        @Column(name = "fecha_carga")
        private Date fechaCarga;
        @Column(name = "fecha_mod")
        private Date fechaMod;
        @JsonManagedReference
        @RestResource(exported=false)
        @OneToMany(mappedBy = "estructura", fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL)
        private List<Paso> pasos = new ArrayList<Paso>();
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_carga", referencedColumnName = "id")
        private Usuario usuarioCarga;
        @RestResource(exported=false)
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "usuario_mod", referencedColumnName = "id")
        private Usuario usuarioMod;

        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getEstructura() {
            return estructura;
        }
        public void setEstructura(String estructura) {
            this.estructura = estructura;
        }
        public Date getFechaCarga() {
            return fechaCarga;
        }
        public void setFechaCarga(Date fechaCarga) {
            this.fechaCarga = fechaCarga;
        }
        public Date getFechaMod() {
            return fechaMod;
        }
        public void setFechaMod(Date fechaMod) {
            this.fechaMod = fechaMod;
        }
        public Usuario getUsuarioCarga() {
            return usuarioCarga;
        }
        public void setUsuarioCarga(Usuario usuarioCarga) {
            this.usuarioCarga = usuarioCarga;
        }
        public Usuario getUsuarioMod() {
            return usuarioMod;
        }
        public void setUsuarioMod(Usuario usuarioMod) {
            this.usuarioMod = usuarioMod;
        }
        public List<Paso> getPasos() {
            return pasos;
        }
        public void setPasos(List<Paso> pasos) {
            this.pasos = pasos;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((estructura == null) ? 0 : estructura.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Estructura other = (Estructura) obj;
            if (estructura == null) {
                if (other.estructura != null)
                    return false;
            } else if (!estructura.equals(other.estructura))
                return false;
            return true;
        }

    }

这是错误,我知道这是一个递归,但不知道如何解决它,我对Data Rest很新,所以任何帮助都会受到赞赏。

错误:

    {"timestamp":1466523913292,"status":500,"error":"Internal Server Error","exception":"org.springframework.http.converter.HttpMessageNotWritableException","message":"org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"])","path":"/expedientePaso/"}

1 个答案:

答案 0 :(得分:0)

我最终使用了这个SPRING STATE MACHINE。 并不是真正回答最初的问题,但它是一个更好的解决方案。