Maxi Bisurgi
Maxi Bisurgi

Reputation: 353

Spring Data Rest - Exposing ID

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!

Upvotes: 2

Views: 1498

Answers (1)

David B.
David B.

Reputation: 39

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;
        }
    }
}

Upvotes: 1

Related Questions