1

when I'm going to make a request to my api i got this erros: i try to found some question about it but not found any quaestion and answer that can aplicate in my case, i hope one of your can do that for me.

   com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle (through reference chain: java.util.ArrayList[0]->digifred.arrecadacao.producaoPrimaria.model.Produtos["produtoPrincipal"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:269) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:879) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:666) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:678) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) ~[jackson-databind-2.7.4.jar:2.7.4]
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149) ~[jackson-databind-2.7.4.jar:2.7.4]

i use Spring boot aplication and angularJs in the front end .. look at my code:

my request to api:

carregarProdutos = function() {
        $http({
            method : 'GET',
            url : '/user/produtos'              
        }).then(function(response) {
            $scope.produtos = response.data;
            $scope.idEntidade = response.data[0].entidade.idEntidade;
            $scope.nomeEntidade = response.data[0].entidade.nome;

        }, function(response) {
            console.log(response.data);
            console.log(response.status);
        });
    }; 

my controller

@RequestMapping(method = RequestMethod.GET, value = "/produtos")
    public ResponseEntity<Collection<Produtos>> buscarTodosProdutos(HttpServletRequest request) throws  Exception { 

        String idEntidadeCrypt = request.getHeader("DataBase");
        Long idEntidade = Long.parseLong(Crypto.decode(idEntidadeCrypt));

        Collection<Produtos> buscados = proService.buscarFiltro(idEntidade);
            return new ResponseEntity<>(buscados, HttpStatus.OK);
    } 

and my class model:

@Entity
@Audited
@AuditTable(schema = "aud", value = "arr_produtos")
@EntityListeners(AuditingEntityListener.class)
@Table(name = "produtos", schema = "arr")
public class Produtos implements Serializable {


    private static final long serialVersionUID = 4211612266058833945L;


    @NotNull
    @JoinColumn(name = "id_entidade")
    @ManyToOne(/*cascade = CascadeType.ALL*/)
    private Entidades entidade;


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_produto")
    private Long idProduto;


    @Basic(optional = false)
    @Column(name = "codigo_chave")
    private String codigoChave;



    @Column(name = "abreviatura")
    private String abreviatura;



    @JoinColumn(name = "id_produto_principal")
    @ManyToOne
    private  Produtos produtoPrincipal;
4

1 回答 1

1

Which part of the error is confusing you? The produtoPrincipal field references the object itself, i.e. x.produtoPrincipal = x.

When you export to JSON, that becomes an unending JSON:

{
  "idProduto": 1,
  "produtoPrincipal": {
    "idProduto": 1,
    "produtoPrincipal": {
      "idProduto": 1,
      "produtoPrincipal": {
        "idProduto": 1,
        "produtoPrincipal": ...

Either:

  1. Fix the data so it doesn't reference itself.

  2. Figure out what you want the JSON to be when it does, then change code accordingly, e.g. don't include full Produtos object for the "principal", just the identifier:

    {
      "idProduto": 1,
      "idProdutoPrincipal": 1
    }
    
于 2018-01-21T21:33:15.627 回答