【问题标题】:Katharsis in combination with Spring BootKatharsis 与 Spring Boot 结合使用
【发布时间】:2017-02-01 10:14:56
【问题描述】:

我已经使用 Spring Boot(版本 1.3.6.RELEASE)实现了一个 REST API,它按预期工作。不过我想为我的应用程序添加 JSON API 支持。

问题是我在尝试对 Katharsis 资源执行 GET 时收到 404。

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 类:

@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;
    }
}

如果我添加 Spring @ResourceMappings 而不是返回数据但没有 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 配置:

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

The request and response from PostMan

-- 更新 1--

显然 kathasis.pathPrefix 的配置值不正确。 Web 应用的 context-root 是“/api”,katharsis.pathPrefix 的值只能是“/kat”。

我的下一个问题是 RepositoryNotFoundException 在处理请求时被抛出,而 Resource 类已经被发现。

【问题讨论】:

    标签: java spring spring-boot katharsis


    【解决方案1】:

    我在任何地方都没有看到您的 foo 数据服务实现。但是,我 99% 确定您没有传递 json api 接受类型。

    Accept: application/vnd.api+json
    

    【讨论】:

    • 请查看更新后的评论。我确实使用 application/vnd.api+json.
    • 我需要查看实际的客户端代码。我在这里看到了你的服务器端实现。
    【解决方案2】:

    我通过调试代码并发现我的 Katharsis 配置不正确解决了这个谜题。 Katharsis 只拾取资源类,而不拾取资源存储库类。当我将 kathasis.resourcePackage 更改为资源存储库所在的更高级别时,问题得到解决,并且 Katharsis 拾取了所有相关的注释类。

    【讨论】:

    • 我很高兴你知道了。 Katharsis 确实有一个问题,如果你给它错误的接受类型,你会得到一个 404
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2014-02-20
    • 2020-09-17
    • 2021-05-11
    • 2018-08-07
    相关资源
    最近更新 更多