Java Spring数据Rest资源处理失败
我试图使用SpringDataREST资源处理器来添加到资源的链接;但是,在Java Spring数据Rest资源处理失败,java,spring,spring-mvc,spring-data-rest,Java,Spring,Spring Mvc,Spring Data Rest,我试图使用SpringDataREST资源处理器来添加到资源的链接;但是,在MockMvc集成测试期间,它出现了一个类强制转换异常,抱怨EmptyCollectionEmbeddedWrapper无法转换为ResourceSupport(ResourceProcessor参数化类型的边界): 此时返回的值应该是空的(正如EmptyCollectionEmbeddedWrapper所建议的那样),但是当然,类强制转换不是有意的。正如堆栈跟踪所示,此异常发生在资源后处理期间;如果我删除了一个用于此类
MockMvc
集成测试期间,它出现了一个类强制转换异常,抱怨EmptyCollectionEmbeddedWrapper
无法转换为ResourceSupport
(ResourceProcessor
参数化类型的边界):
此时返回的值应该是空的(正如EmptyCollectionEmbeddedWrapper
所建议的那样),但是当然,类强制转换不是有意的。正如堆栈跟踪所示,此异常发生在资源后处理期间;如果我删除了一个用于此类型的简单资源处理器,则类强制转换异常将消失,请求将成功。这让我感到惊讶,因为资源处理器基本上是从文档中提出来的
更详细地说,资源参数类型是通知
;失败的MockMvc
请求如下所示:
perform(get(entityLinks.linkToSearchResource(Notification.class, NotificationRepository.ACTIVE_SEARCH)
.expand(Collections.singletonMap("projectId", 1)).getHref()))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.notifications").isEmpty());
而ResourceProcessor
看起来像:
@Bean
public ResourceProcessor<Resource<Notification>> notificationResourceProcessor(RepositoryEntityLinks entityLinks) {
return notificationResource -> {
notificationResource.add(entityLinks.linkToCollectionResource(NotificationAction.class));
return notificationResource;
};
}
@Bean
公共资源处理器通知资源处理器(RepositoryEntityLinks entityLinks){
返回通知资源->{
添加(entityLinks.linkToCollectionResource(NotificationAction.class));
返回通知资源;
};
}
我想我有一些配置错误,因为这似乎是SpringDataREST的一个非常基本的用法。我缺少什么?在ResourceProcessor中调试后,Invoker发现ResourceProcessor的解析类型不是预期的
ResourceProcessor
(在您的案例中是ResourceProcessor
),而是ResourceProcessor>
。原因是使用lambda创建处理器。
以旧方式创建匿名类解决了我的问题:
@Bean
public ResourceProcessor<Resource<Notification>> notificationResourceProcessor(RepositoryEntityLinks entityLinks) {
return new ResourceProcessor<Resource<Notification>>() {
@Override
public Resource<Notification> process(Resource<Notification> notificationResource) {
notificationResource.add(entityLinks.linkToCollectionResource(NotificationAction.class));
return notificationResource;
}
};
}
@Bean
公共资源处理器通知资源处理器(RepositoryEntityLinks entityLinks){
返回新的ResourceProcessor(){
@凌驾
公共资源流程(资源通知资源){
添加(entityLinks.linkToCollectionResource(NotificationAction.class));
返回通知资源;
}
};
}
@Bean
public ResourceProcessor<Resource<Notification>> notificationResourceProcessor(RepositoryEntityLinks entityLinks) {
return new ResourceProcessor<Resource<Notification>>() {
@Override
public Resource<Notification> process(Resource<Notification> notificationResource) {
notificationResource.add(entityLinks.linkToCollectionResource(NotificationAction.class));
return notificationResource;
}
};
}