Выставление идентификатора в сериализованном json при использовании spring data rest

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>
You can leave a response, or trackback from your own site.

Leave a Reply