文章目录

  • 遇到问题
  • 学习过程中的问题总结

遇到问题

最近在学习《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的问题相关推荐

  1. 匿名内部类与Lambda表达式习题

    匿名内部类与Lambda表达式习题 1.写一个函数式接口 public Operation{ public int calc(int a,int b); } 在测试类中写一个method方法,参数为O ...

  2. 匿名内部类与Lambda表达式

    匿名内部类与Lambda表达式 一.匿名内部类 谁没有名字:匿名内部类指的是接口的实现类 或者 抽象类的子类没有名字. 1.前提: 1)必须要有一个接口.抽象类(普通类也可以,但是方法不会强制重写,不 ...

  3. 【Android-Kotlin】匿名内部类与Lambda 表达式(附RecycleView监听)

    一:匿名内部类 一个Test类,里面 1)1个属性 2)1个方法 a.该方法传递的参数是一个接口对象,目的是在这个方法中可以通过这个对象来调用接口方法 接口对象的接口TestInterFace内部有一 ...

  4. java8新特性学习笔记之唠唠“匿名内部类与lambda”

    负一.知道啥是匿名内部类不? 要使用lambda,我觉得你至少得明白匿名内部类是个啥."o -> o.getName"是lambda表达式,"Book::getNa ...

  5. 扬声器的特性以及一个奇怪的振荡器

    基于扬声器的振荡器 01 扬声器 一.前言   这是一个从会议电话设备上拆卸下来的一个扬声器. 下面对于它的基本特性进行测试, 并最后验证一个 非常奇特电路 的工作原理. 这个扬声器安装在一个塑料壳之 ...

  6. Java匿名内部类和Lambda表达式

    Java匿名内部类和Lambda表达式 一.Java匿名内部类 二.JavaLambda表达式 全部代码: 代码运行结果: 一.Java匿名内部类 我们在使用匿名内部类时,需要记住以下几个重要的知识点 ...

  7. MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题

    今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...

  8. java线程未执行完成,java线程测试-一个奇怪的景况-执行未完成直接结束了

    java线程测试-一个奇怪的状况-执行未完成直接结束了 import org.junit.Test; /** * 同步线程测试 * @author jview * */ public class te ...

  9. Delphi XE 使用 MySQL 数据库一个奇怪的问题

    Delphi XE 使用 MySQL 数据库一个奇怪的问题 我用的是自带的 ADO 组件连接 MYSQL ,连接很简单,如下: 1.下载一个 MYSQL 驱动安装上 下载地址 2.连接串 Adoc.C ...

最新文章

  1. 形状相似的物品_我的世界:MC早期物品和现在的对比,差别很大
  2. !--处理:借款冲销不自动冲减预算--
  3. 高速串行自同步方式介绍及原理
  4. [置顶] Objective-C,/,ios,/iphone开发基础:分类(category,又称类别)
  5. 数据中心业界迎来机器学习工具
  6. 机器学习算法Python实现:gensim里的similarities文本相似度计算
  7. lucene索引创建
  8. [转]云计算:SaaS、PaaS、IaaS、CaaS
  9. python 文本处理 保留中英文和标点符号_问一下处理英文文本
  10. 【Linux】学习历程
  11. Webpack打包UMD的export要带default访问问题
  12. python拆分大文件(大文件分割)
  13. Pipeline支撑运维自动化:sftp原子模块
  14. STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机
  15. ldaps 认证环境
  16. 10年新年计划与愿望
  17. hdu1234 开门人与关门人
  18. 高交会文思海辉三项成果斩获优秀产品奖
  19. resnet 在残差结构内增加注意力机制并且预训练
  20. 微信朋友圈公众号装B神器网站源码+可用于引流

热门文章

  1. 接入百度商桥遇到的问题
  2. 计算机再带word打不开怎么办,小编教你电脑word打不开怎么办
  3. 计算机乘法怎么操作函数,计算机word乘积函数
  4. 仗剑天涯,戎马一生!
  5. CISA提醒修复这些严重的ICS漏洞
  6. 【信号与系统】(十九)傅里叶变换与频域分析——LTI系统的频域分析
  7. 银河计算机网络科技公司,银河开关,科技创新 银河无限
  8. java实现一定精度的开根号运算
  9. 百度视频质量评测的实践之路
  10. 思科网络交换机配置命令(详细命令总结归纳)