java - 用于投影异常的 Spring Data Rest ResourceProcessor

标签 java spring spring-data-rest

我创建了以下 Projection

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

    Long getId();

    String getName();

}

我想基本上在“选择”组件中使用它,所以我需要尽可能少的数据。所以我还想删除所有带有 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

知道我做错了什么吗?

最佳答案

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

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

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

您可以将其定义为独立类,而不是 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();
}

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

并非 spring-data-rest 通过 ResourceProcessor 放置的所有内容都是 Resourceorg.springframework.hateoas.ResourceSupport 类(如 PagedResources 在您的情况下)可以有不同的后代,其中大部分不是从 Resource.

关于java - 用于投影异常的 Spring Data Rest ResourceProcessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43087647/

相关文章:

java - java中空格后取字符

java - Axis2 命名空间/类路径问题

java - Tomcat 7 最大线程问题

java - JSR 303 Bean Validation 可以与 Spring Data Rest 一起使用吗?

java - 手机上的注册 Activity 卡住

java 。在内部回调中获取同步数据

java - 如何获取表单:select in a Spring MVC的选定项目id和值

Spring AOP Aspect 无法使用 Mockito 工作

java - 无法通过 JPA (Hibernate) 连接的继承链中的根类加载实体

spring-boot - 将自定义 HttpMessageConverter 添加到 spring-boot/spring-data-rest 应用程序