Катарсис в сочетании с Spring Boot

Я реализовал REST API с помощью Spring Boot (версия 1.3.6.RELEASE), который работает как положено. Однако я хотел бы добавить поддержку JSON API в мое приложение.

Проблема в том, что я получаю 404 при попытке выполнить GET на ресурсе Katharsis.

Зависимости в pom.xml выглядят следующим образом (я тоже использую Spring Security):

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.hsqldb</groupId>
                <artifactId>hsqldb</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-integration</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
        <groupId>org.codehaus.woodstox</groupId>
        <artifactId>woodstox-core-asl</artifactId>
        <version>4.4.1</version>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>${hsqldb.version}</version>
    </dependency>
    <!--SpringFox dependencies -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${springfox-version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${springfox-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-tools</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>dumbster</groupId>
        <artifactId>dumbster</artifactId>
        <version>1.6</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.katharsis</groupId>
        <artifactId>katharsis-spring</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.9</version>
    </dependency>
</dependencies>

Мой класс инициализации приложения выглядит следующим образом:

@SpringBootApplication
@Configuration
@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)
@EnableSwagger2
@ComponentScan(basePackages = "com.myapp")
@Import({KatharsisConfigV2.class})
public class Application {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }
}

Класс ресурса:

@ApiModel(description = "")
@JsonApiResource(type = "foo-data")
public class FooData extends DomainRepresentation {
    @JsonApiId
    private String id = null;
    @JsonProperty
    private String name = null;
    // .... getters & setters
}

ResourceRepository class:

@JsonApiResourceRepository(FooData.class)
@Component
public class FooDataKatApi extends MyApi {
    @Autowired
    private FooDataService fooDataService;

    @JsonApiFindOne
    public FooData foodataIdGet(String id, QueryParams requestParams) { 
        FooData result = fooDataService.getFooDataById(id);
        return result;
    }
}

Если я добавлю весну @ResourceMappingКроме того, я получаю данные обратно, но без добавлений Katharsis, таких как "ссылка" и т. д. Это похоже на то, что вызов API не обрабатывается Katharsis, а обрабатывается Spring.

Любая помощь будет оценена.

- отредактировано -

FooDataService выглядит следующим образом:

@Service
public class FooDataService extends MyService {
    @Autowired
    private FooDataRepository fooDataRepository;

    public FooData getFooDataById(String id) {
        FooDataEnt fooDataEnt = fooDataRepository.findByFooDataId(id);

        if (fooDataEnt != null) {
            return convertFooDataEntToFooData.apply(fooDataEnt);
        }

        throw new NotFoundException("Foo not found");
    }
}

FooDataRepository расширяет Spring PagingAndSortingRepository.

Конфиг катарсиса в application.yaml:

katharsis:
    resourcePackage: com.my.package
    domainName: http://localhost:8080
    pathPrefix: /api/kat

Запрос и ответ от PostMan

- ОБНОВЛЕНИЕ 1 -

Видимо, настроенное значение для katharsis.pathPrefix было неправильным. Корень контекста веб-приложения - "/api", а значение katharsis.pathPrefix должно быть только "/kat".

Моя следующая проблема заключается в том, что при обработке запроса генерируется исключение RepositoryNotFoundException, в то время как класс Resource уже найден.

2 ответа

Я нигде не вижу твоей реализации сервиса данных foo. Тем не менее, я на 99% уверен, что вы не передаете JSON API принять тип.

Accept: application/vnd.api+json

Я решил загадку, отладив код и обнаружив, что моя конфигурация Katharsis была неверной. Катарсис подобрал только классы ресурсов, но не классы репозитория ресурсов. Когда я изменил katharsis.resourcePackage на более высокий уровень, где находились репозитории ресурсов, проблема была решена, и Катарсис подобрал все связанные аннотированные классы.

Другие вопросы по тегам