fortm
fortm

Reputation: 4198

Customize Spring Data REST to expose only selected methods from Repository

Spring Data Rest exposes all finder methods in Repository layer and also Schema for Entity after RestRepository annotation is applied to Repository and RepositoryRestMvcConfiguration is enabled.

How can we expose selected methods in repository only and disable entity schema exposure as REST

Also if some Entity property has to be not shown in Json, do we need to anotate JsonIgnore in Entity itself ?

Upvotes: 2

Views: 3116

Answers (2)

Daniel
Daniel

Reputation: 61

Had the same problem and simply created a new interface extending the original repository interface (org.springframework.data.jpa.repository.JpaRepository in my case)

In this new interface I simply annoted every method with @RestResource(exported = false)

public interface NonExposedJpaRepository<T, ID> extends JpaRepository<T, ID> {

    @RestResource(exported = false)
    @Override
    void flush();

    @RestResource(exported = false)
    @Override
    <S extends T> S saveAndFlush(S entity);

    @RestResource(exported = false)
    @Override
    <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

    @RestResource(exported = false)
    @Override
    default void deleteInBatch(Iterable<T> entities) {
        JpaRepository.super.deleteInBatch(entities);
    }

    @RestResource(exported = false)
    @Override
    void deleteAllInBatch(Iterable<T> entities);

    @RestResource(exported = false)
    @Override
    void deleteAllByIdInBatch(Iterable<ID> ids);

    @RestResource(exported = false)
    @Override
    void deleteAllInBatch();

    @RestResource(exported = false)
    @Override
    T getOne(ID id);

    @RestResource(exported = false)
    @Override
    T getById(ID id);

    @RestResource(exported = false)
    @Override
    T getReferenceById(ID id);

    @RestResource(exported = false)
    @Override
    <S extends T> List<S> findAll(Example<S> example);

    @RestResource(exported = false)
    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);

    @RestResource(exported = false)
    @Override
    <S extends T> List<S> saveAll(Iterable<S> entities);

    @RestResource(exported = false)
    @Override
    List<T> findAll();

    @RestResource(exported = false)
    @Override
    List<T> findAllById(Iterable<ID> ids);

    @RestResource(exported = false)
    @Override
    <S extends T> S save(S entity);

    @RestResource(exported = false)
    @Override
    Optional<T> findById(ID id);

    @RestResource(exported = false)
    @Override
    boolean existsById(ID id);

    @RestResource(exported = false)
    @Override
    long count();

    @RestResource(exported = false)
    @Override
    void deleteById(ID id);

    @RestResource(exported = false)
    @Override
    void delete(T entity);

    @RestResource(exported = false)
    @Override
    void deleteAllById(Iterable<? extends ID> ids);

    @RestResource(exported = false)
    @Override
    void deleteAll(Iterable<? extends T> entities);

    @RestResource(exported = false)
    @Override
    void deleteAll();

    @RestResource(exported = false)
    @Override
    List<T> findAll(Sort sort);

    @RestResource(exported = false)
    @Override
    Page<T> findAll(Pageable pageable);

    @RestResource(exported = false)
    @Override
    <S extends T> Optional<S> findOne(Example<S> example);

    @RestResource(exported = false)
    @Override
    <S extends T> Page<S> findAll(Example<S> example, Pageable pageable);

    @RestResource(exported = false)
    @Override
    <S extends T> long count(Example<S> example);

    @RestResource(exported = false)
    @Override
    <S extends T> boolean exists(Example<S> example);

    @RestResource(exported = false)
    @Override
    <S extends T, R> R findBy(Example<S> example, Function<FluentQuery.FetchableFluentQuery<S>, R> queryFunction);
}

Now you can choose which methods to be exported:

@RepositoryRestResource(exported = true)
public interface MyEntityRepository extends NonExposedJpaRepository<MyEntity, Long> {
    @Override
    @RestResource(exported = true)
    Page<MyEntity> findAll(Pageable pageable);
}
    

Upvotes: 0

rocky
rocky

Reputation: 5004

Im afraid you will have to use @RestResource(exported=false) either on each method ( so overriding it ).

2nd question: yes, use JsonIgnore.

Upvotes: 4

Related Questions