
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);
} |
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> |
<dependency>
<groupId>net.sf.corn</groupId>
<artifactId>corn-cps</artifactId>
<version>1.0.1</version>
</dependency>