Spring 投影异常的数据 Rest ResourceProcessor

Spring Data Rest ResourceProcessor for Projection Exception

我创建了以下 Projection

@Projection(name = "select", types = {Organisation.class})
public interface OrganisationSelectProjection {

    Long getId();

    String getName();

}

我想在 "Select" 组件中使用它,所以我需要尽可能少的数据。所以我也想删除所有带有 ResourceProcessor 的链接,所以我创建了这个:

@Bean
public ResourceProcessor<Resource<OrganisationSelectProjection>> organisationProcessor() {
    return resource -> {
        resource.removeLinks();
        return resource;
    };
}

但是,这似乎破坏了整个 API,因为无论我点击哪个端点,我都会收到以下异常消息 org.springframework.hateoas.PagedResources cannot be cast to org.springframework.hateoas.Resource

知道我做错了什么吗?

如果您想保留匿名 class,使用 ResourceSupport 而不是 Resource 可以解决问题。

@Bean
public ResourceProcessor<ResourceSupport> organisationProcessor() {
    return resource -> {
        resource.removeLinks();
        return resource;
    };
}

但在这种情况下,无论内容的类型如何,处理器都将用于每个资源(不过您可以在方法主体中检查)。

您可以将其定义为独立 class:

而不是 ResourceProcessor 的匿名后代
public class OrganizationResourceProcessor implements ResourceProcessor<Resource<OrganisationSelectProjection>> {
    @Override
    public Resource<OrganisationSelectProjection> process(Resource<OrganisationSelectProjection> resource) {
        resource.removeLinks();
        return resource;
    }
}

@Bean
public OrganizationResourceProcessor  organisationProcessor() {
    return new OrganizationResourceProcessor();
}

您遇到的问题与类型擦除有关,因为匿名 class 实现中没有任何类型参数。您的定义是类型安全的,但它缺少在确定特定 ResourceProcessor 是否可以处理资源时在运行时使用的类型相关数据。所以 spring-data-rest 认为匿名 organizationProcessor 可以处理 PagedResources 并将其提供给 ClassCastException 发生的处理器。

并非 spring-data-rest 通过 ResourceProcessor 的所有内容都是 Resourceorg.springframework.hateoas.ResourceSupport class 可以有不同的后代(比如 PagedResources 在你的情况下),其中大多数不是从 Resource.

继承的