2

I am trying to expose the Id of my domain on the Json response using Spring Data Rest, besides getting it on the self object. I try what I saw on the internet but it is not working. I am using Spring Boot and this is my starting class and my config class for exposing the Id.

package com.desingfreed;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.designfreed")
public class GaliasBackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(GaliasBackendApplication.class, args);
    }
}

package com.desingfreed.config;

import com.desingfreed.domain.Articulo;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
import org.springframework.stereotype.Component;

@Component
public class ConfigurationRest extends RepositoryRestConfigurerAdapter {
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Articulo.class);
    }
}

package com.desingfreed.repositories;

import com.desingfreed.domain.Articulo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "articulos", path = "articulos")
public interface ArticuloRepository extends CrudRepository<Articulo, Long> {
}

package com.desingfreed.domain;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "STA11")
public class Articulo {
    @Id
    @GeneratedValue
    @Column(name = "ID_STA11")
    private Long id;

    @Column(name = "COD_ARTICU")
    private String codigo;

    @Column(name = "DESCRIPCIO")
    private String descripcion;

//    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "articulo")
//    private List<Precio> precios = new ArrayList<>();

    public Articulo() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

//    public List<Precio> getPrecios() {
//        return precios;
//    }
//
//    public void setPrecios(List<Precio> precios) {
//        this.precios = precios;
//    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Articulo articulo = (Articulo) o;

        if (id != null ? !id.equals(articulo.id) : articulo.id != null) return false;
        if (codigo != null ? !codigo.equals(articulo.codigo) : articulo.codigo != null) return false;
        return descripcion != null ? descripcion.equals(articulo.descripcion) : articulo.descripcion == null;
    }

    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (codigo != null ? codigo.hashCode() : 0);
        result = 31 * result + (descripcion != null ? descripcion.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Articulo{" +
                "id=" + id +
                ", codigo='" + codigo + '\'' +
                ", descripcion='" + descripcion + '\'' +
                '}';
    }
}

Although doing this I still can get the Id on the Json response, I still get like this:

"_embedded" : {
    "articulos" : [ {
      "codigo" : "111012082",
      "descripcion" : "VIRGEN LEV. FRESCA X 500G",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/articulos/1"
        },
        "articulo" : {
          "href" : "http://localhost:8080/articulos/1"
        }
      }

Thanks very much!

Maxi Bisurgi
  • 343
  • 1
  • 4
  • 15
  • can you update your quesion with your repository class and Articulo class – pvpkiran Apr 28 '17 at 07:00
  • I added what you ask! Thanks very much! – Maxi Bisurgi Apr 28 '17 at 13:48
  • I just tried the exact code you have given, It works perfectly fine for me. For url http://localhost:8090/articulos/1, I can see something like this { "id" : 1, "codigo" : "codigo", "descripcion" : "desc", "_links" : { "self" : { "href" : "http://localhost:8090/articulos/1" }, "articulo" : { "href" : "http://localhost:8090/articulos/1" } } } which version of spring-boot and spring-data-rest are you using? – pvpkiran May 02 '17 at 08:35
  • Possible duplicate of [Spring boot @ResponseBody doesn't serialize entity id](https://stackoverflow.com/questions/24839760/spring-boot-responsebody-doesnt-serialize-entity-id) – lcnicolau Mar 10 '19 at 00:22

1 Answers1

1

For your information, i've created a simple component to dynamically expose every id.

@Component
public class EntityExposingIdConfiguration extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        try {
            Field exposeIdsFor = RepositoryRestConfiguration.class.getDeclaredField("exposeIdsFor");
            exposeIdsFor.setAccessible(true);
            ReflectionUtils.setField(exposeIdsFor, config, new ListAlwaysContains());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

    class ListAlwaysContains extends ArrayList {

        @Override
        public boolean contains(Object o) {
            return true;
        }
    }
}
David B.
  • 39
  • 1