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
的所有内容都是 Resource
。 org.springframework.hateoas.ResourceSupport
class 可以有不同的后代(比如 PagedResources
在你的情况下),其中大多数不是从 Resource
.
继承的
我创建了以下 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
的所有内容都是 Resource
。 org.springframework.hateoas.ResourceSupport
class 可以有不同的后代(比如 PagedResources
在你的情况下),其中大多数不是从 Resource
.