一个奇怪的问题:匿名内部类用Lambda替换以后出现了cannot be cast to class的问题
文章目录
- 遇到问题
- 学习过程中的问题总结
遇到问题
最近在学习《Spring实战》,学习到第六章的Spring Data端点添加自定义的超链接
时遇到了一个奇怪的问题。
当我向http://localhost:8080/api/tacos
发起请求时,发生了如下的错误:
{"cause": null,"message": "class org.springframework.data.rest.webmvc.PersistentEntityResource cannot be cast to class org.springframework.hateoas.PagedModel (org.springframework.data.rest.webmvc.PersistentEntityResource and org.springframework.hateoas.PagedModel are in unnamed module of loader 'app')"
}
而我只是将第一段代码替换为了替换为了第二段代码。而且第二段的Lambda表达式还是IDEA自动替换的。
第一段代码
@Beanpublic RepresentationModelProcessor<PagedModel<EntityModel<Taco>>> tacoProcessor(EntityLinks links) {return new RepresentationModelProcessor<PagedModel<EntityModel<Taco>>>() {@Overridepublic PagedModel<EntityModel<Taco>> process(PagedModel<EntityModel<Taco>> resource) {resource.add(links.linkFor(Taco.class).slash("recent").withRel("recents"));return resource;}};}
第二段代码:
@Beanpublic RepresentationModelProcessor<PagedModel<EntityModel<Taco>>> tacoProcessor(EntityLinks links) {return resource -> {resource.add(links.linkFor(Taco.class).slash("recent").withRel("recents"));return resource;};}
不太明白为什么将其使用Lambda替换以后请求同样的地址却会发生这样的问题。使用匿名内部类的形式的时候请求http://localhost:8080/api/tacos
则能正常返回数据。
由于这个问题发生的得有些莫名其妙,我先记录在此,期待大佬解答。
详细代码如下:位于spring-in-action-5-samples-master/ch06
章节
我的代码仓库
学习过程中的问题总结
接着我再回顾一下学习《Spring 实战》这本书时一路上遇到的问题。
由于原文用的Spring Boot的版本时2.0.4.RELEASE
。使用这个版本的Spring Boot则会发生如下问题
详情可以见我的另一篇博客:
Maven中依赖的优先级问题
原因是因为org.hibernate.validator:hibernate-validator:jar:6.0.11.Final
这个包有些问题,建议更新到更高的版本。
然后我就将Spring Boot的版本提高到了2.2.6.RELEASE
在该版本的Spring Boot中hibernate-validator
的版本提高到了6.0.18Final
则没有上述的问题,
但是不幸的是,学习到了第六章使用Spring HATEOAS
时高版本的Spring Boot却带来了很多问题。
书上使用的是2.0.4.RELEASE
这个版本的Spring Boot对应是Spring HATEOAS 0.25
。
而2.2.6.RELEASE
版本的Spring Boot对应的则是Spring HATEOAS 1.0.4
的版本。
不幸的是,从0.25变到1.0.4,Spring HATEOAS的API发生了很大改变,0.25版本中的Spring HATEOAS的很多API,对应到1.0.4版本的Spring HATEOAS,名字都已经发生了很大的改变,用法也有些区别。
Spring HATEOAS 0.25中的API | 对应 | Spring HATEOAS 1.0.4中的APT |
---|---|---|
ResourceSupport | 对应 | RepresentationModel |
Resource | 对应 | EntityModel |
Resources | 对应 | CollectionModel |
PagedResources | 对应 | PageModel |
ResourceAssembler | 对应 | RepresentationModelAssembler |
ResourceAssembler中的toResource(…),toResources(…) | 对应 | RepresentationModelAssembler中的toModel(…)和toCollectionModel(…) |
除此之外:
RepresentationModel.getLinks()现在公开了一个Links实例(通过List),该实例公开了其他API,以Links使用各种策略来连接和合并不同的实例。同样,它已经变成了自绑定的泛型类型,以允许向实例添加链接的方法返回实例本身。
LinkDiscovererAPI已移动到client包。
在LinkBuilder和EntityLinksAPI已经被移到了server包。
ControllerLinkBuilder已移入server.mvc,不推荐使用替换WebMvcLinkBuilder。
RelProvider已重命名为LinkRelationProvider并返回LinkRelation实例,而不是String。
VndError已移至mediatype.vnderror套件。
因此原书中的如下代码应该进行修改:
package tacos.web.api;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.hateoas.EntityLinks;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.Resource;
import org.springframework.hateoas.ResourceProcessor;import tacos.Taco;@Configuration
public class SpringDataRestConfiguration {@Beanpublic ResourceProcessor<PagedResources<Resource<Taco>>>tacoProcessor(EntityLinks links) {return new ResourceProcessor<PagedResources<Resource<Taco>>>() {@Overridepublic PagedResources<Resource<Taco>> process(PagedResources<Resource<Taco>> resource) {resource.add(links.linkFor(Taco.class).slash("recent").withRel("recents"));return resource;}};}}
修改为如下:
package tacos.web.api;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.PagedModel;import org.springframework.hateoas.server.EntityLinks;
import org.springframework.hateoas.server.RepresentationModelProcessor;
import tacos.Taco;@Configuration
public class SpringDataRestConfiguration {@Beanpublic RepresentationModelProcessor<PagedModel<EntityModel<Taco>>> tacoProcessor(EntityLinks links) {return new RepresentationModelProcessor<PagedModel<EntityModel<Taco>>>() {@Overridepublic PagedModel<EntityModel<Taco>> process(PagedModel<EntityModel<Taco>> resource) {resource.add(links.linkFor(Taco.class).slash("recent").withRel("recents"));return resource;}};}
}
参考
Spring HATEOAS 1.0 版本的变化
一个奇怪的问题:匿名内部类用Lambda替换以后出现了cannot be cast to class的问题相关推荐
- 匿名内部类与Lambda表达式习题
匿名内部类与Lambda表达式习题 1.写一个函数式接口 public Operation{ public int calc(int a,int b); } 在测试类中写一个method方法,参数为O ...
- 匿名内部类与Lambda表达式
匿名内部类与Lambda表达式 一.匿名内部类 谁没有名字:匿名内部类指的是接口的实现类 或者 抽象类的子类没有名字. 1.前提: 1)必须要有一个接口.抽象类(普通类也可以,但是方法不会强制重写,不 ...
- 【Android-Kotlin】匿名内部类与Lambda 表达式(附RecycleView监听)
一:匿名内部类 一个Test类,里面 1)1个属性 2)1个方法 a.该方法传递的参数是一个接口对象,目的是在这个方法中可以通过这个对象来调用接口方法 接口对象的接口TestInterFace内部有一 ...
- java8新特性学习笔记之唠唠“匿名内部类与lambda”
负一.知道啥是匿名内部类不? 要使用lambda,我觉得你至少得明白匿名内部类是个啥."o -> o.getName"是lambda表达式,"Book::getNa ...
- 扬声器的特性以及一个奇怪的振荡器
基于扬声器的振荡器 01 扬声器 一.前言 这是一个从会议电话设备上拆卸下来的一个扬声器. 下面对于它的基本特性进行测试, 并最后验证一个 非常奇特电路 的工作原理. 这个扬声器安装在一个塑料壳之 ...
- Java匿名内部类和Lambda表达式
Java匿名内部类和Lambda表达式 一.Java匿名内部类 二.JavaLambda表达式 全部代码: 代码运行结果: 一.Java匿名内部类 我们在使用匿名内部类时,需要记住以下几个重要的知识点 ...
- MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题
今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...
- java线程未执行完成,java线程测试-一个奇怪的景况-执行未完成直接结束了
java线程测试-一个奇怪的状况-执行未完成直接结束了 import org.junit.Test; /** * 同步线程测试 * @author jview * */ public class te ...
- Delphi XE 使用 MySQL 数据库一个奇怪的问题
Delphi XE 使用 MySQL 数据库一个奇怪的问题 我用的是自带的 ADO 组件连接 MYSQL ,连接很简单,如下: 1.下载一个 MYSQL 驱动安装上 下载地址 2.连接串 Adoc.C ...
最新文章
- 形状相似的物品_我的世界:MC早期物品和现在的对比,差别很大
- !--处理:借款冲销不自动冲减预算--
- 高速串行自同步方式介绍及原理
- [置顶] Objective-C,/,ios,/iphone开发基础:分类(category,又称类别)
- 数据中心业界迎来机器学习工具
- 机器学习算法Python实现:gensim里的similarities文本相似度计算
- lucene索引创建
- [转]云计算:SaaS、PaaS、IaaS、CaaS
- python 文本处理 保留中英文和标点符号_问一下处理英文文本
- 【Linux】学习历程
- Webpack打包UMD的export要带default访问问题
- python拆分大文件(大文件分割)
- Pipeline支撑运维自动化:sftp原子模块
- STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机
- ldaps 认证环境
- 10年新年计划与愿望
- hdu1234 开门人与关门人
- 高交会文思海辉三项成果斩获优秀产品奖
- resnet 在残差结构内增加注意力机制并且预训练
- 微信朋友圈公众号装B神器网站源码+可用于引流