Spring data rest является сравнительно новым проектом, одной из задач которого было избавить разработчика от необходимости писать во многих местах повторяющийся код. По какой-то причине авторы решили, что по умолчанию идентификатор (поле с аннотацией @Id) сущности из БД при сериализации выводить не надо, достаточно выводить его в пути. В данной заметке я расскажу, как это исправить.
В класс конфигурации (с аннотацией @Configuration и наследующийся от RepositoryRestConfigurerAdapter или RepositoryRestMvcConfiguration) мы добавляем метод:
import net.sf.corn.cps.CPScanner; import net.sf.corn.cps.ClassFilter; import net.sf.corn.cps.PackageNameFilter; ... @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // находим все классы с аннотацией @Entity List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter("ru.outofrange.entity.*"), new ClassFilter().appendAnnotation(Entity.class)); Class[] arrayClasses = new Class[classes.size()]; // помещаем в массив - так требует API for (int i = 0; i < classes.size(); i++) { arrayClasses[i] = classes.get(i); } // теперь все найденные классы будут сериализоваться с идентификатором config.exposeIdsFor(arrayClasses); } |
Для доступа к классу CPScanner и прочим понадобится зависимость:
<dependency> <groupId>net.sf.corn</groupId> <artifactId>corn-cps</artifactId> <version>1.0.1</version> </dependency> |