gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:01 26 4
gpt4 key购买 nike

我创建了以下 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com