Reputation: 4198
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
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
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