Spring 4.1和Java 8:java.util.Optional

logo-spring-io
由于Spring 4.1的Java 8的的java.util.Optional ,容器对象可能会或可能不包含非空值,支持与@RequestParam@RequestHeader@MatrixVariable 。 使用Java 8的java.util.Optional请确保参数永远不会为null


请求参数

在此示例中,我们将使用@RequestParamjava.time.LocalDate绑定为java.util.Optional

@RestController
@RequestMapping("o")
public class SampleController {@RequestMapping(value = "r", produces = "text/plain")public String requestParamAsOptional(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)@RequestParam(value = "ld") Optional<LocalDate> localDate) {StringBuilder result = new StringBuilder("ld: ");localDate.ifPresent(value -> result.append(value.toString()));return result.toString();}
}

在Spring 4.1之前,我们会遇到一个例外,即找不到匹配的编辑器或转换策略。 从Spring 4.1开始,这不再是问题。 为了验证绑定是否正常工作,我们可以创建一个简单的集成测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SampleSomeControllerTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setUp() throws Exception {mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}// ...}

在第一个测试中,我们将检查绑定是否正常工作以及是否返回了正确的结果:

@Test
public void bindsNonNullLocalDateAsRequestParam() throws Exception {mockMvc.perform(get("/o/r").param("ld", "2020-01-01")).andExpect(content().string("ld: 2020-01-01"));
}

在下一个测试中,我们将不传递ld参数:

@Test
public void bindsNoLocalDateAsRequestParam() throws Exception {mockMvc.perform(get("/o/r")).andExpect(content().string("ld: "));
}

两个测试都应该是绿色的!

请求标题

同样,我们可以将@RequestHeader绑定到java.util.Optional

@RequestMapping(value = "h", produces = "text/plain")
public String requestHeaderAsOptional(@RequestHeader(value = "Custom-Header") Optional<String> header) {StringBuilder result = new StringBuilder("Custom-Header: ");header.ifPresent(value -> result.append(value));return result.toString();
}

和测试:

@Test
public void bindsNonNullCustomHeader() throws Exception {mockMvc.perform(get("/o/h").header("Custom-Header", "Value")).andExpect(content().string("Custom-Header: Value"));
}@Test
public void noCustomHeaderGiven() throws Exception {mockMvc.perform(get("/o/h").header("Custom-Header", "")).andExpect(content().string("Custom-Header: "));
}

矩阵变量

在Spring 3.2中@MatrixVariable注释指示方法参数应绑定到路径段内的名称/值对:

@RequestMapping(value = "m/{id}", produces = "text/plain")
public String execute(@PathVariable Integer id,@MatrixVariable Optional<Integer> p,@MatrixVariable Optional<Integer> q) {StringBuilder result = new StringBuilder();result.append("p: ");p.ifPresent(value -> result.append(value));result.append(", q: ");q.ifPresent(value -> result.append(value));return result.toString();
}

可以通过/o/m/42;p=4;q=2 url调用上述方法。 让我们为此做一个测试:

@Test
public void bindsNonNullMatrixVariables() throws Exception {mockMvc.perform(get("/o/m/42;p=4;q=2")).andExpect(content().string("p: 4, q: 2"));
}

不幸的是,该测试将失败,因为默认情况下,Spring MVC中禁用了@MatrixVariable批注的支持。 为了启用它,我们需要调整配置并将RequestMappingHandlerMappingremoveSemicolonContent属性设置为false 。 默认情况下,它设置为true 。 我已经用WebMvcConfigurerAdapter完成了,如下所示:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {UrlPathHelper urlPathHelper = new UrlPathHelper();urlPathHelper.setRemoveSemicolonContent(false);configurer.setUrlPathHelper(urlPathHelper);}
}

现在所有测试都通过了! 请在这里找到本文的源代码: https : //github.com/kolorobot/spring41-samples

翻译自: https://www.javacodegeeks.com/2014/07/spring-4-1-and-java-8-java-util-optional.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络层实验路由表苏州科技,苏州科技大学计算机网络实验报告课案.docx...

苏州科技大学计算机网络实验报告课案苏州科技学院 电子信息实验中心实验报告课  程计算机网络原理学    名徐金玮班  级计算机1312专  业计算机科学与技术指导教师陶滔学年 / 学期2015~2016学年第一学期实验一 物理层实验实验项目性质&#xff1a;设计性  计划学…

Fibonacci again and again

Fibonacci again and again http://acm.hdu.edu.cn/showproblem.php?pid1848 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12494 Accepted Submission(s): 5439 Problem Description任何一个大学生对菲波那…

使用闭包的方式实现一个累加函数 addNum

使用闭包的方式实现一个累加函数 addNum&#xff0c;参数为 number 类型&#xff0c;每次返回的结果 上一次计算的值 传入的值&#xff0c;如&#xff1a; addNum(10); //10 addNum(12); //22 addNum(30); //52 写法一 1 function sum(numberOne) {2 var count…

妈妈的菜谱-豉油鸡

我妈周末来我家&#xff0c;给我做一道豉油鸡&#xff0c;我记录下来&#xff0c;分享给大家 1、下午四点半左右&#xff0c;我、老弟以及亲妈&#xff0c;到隔壁市场鸡场&#xff0c;挑选了一只类似的芦花阉鸡活鸡&#xff0c;价格是17块钱每斤&#xff0c;大概三斤多点&#…

【Vegas2008】9月19日-青椒炒南瓜

南瓜&#xff0c;在俺们家&#xff0c;宁夏也叫葫芦。这道菜泡米饭相当好吃。 主料&#xff1a;青椒、南瓜 配料&#xff1a;葱、姜 调料&#xff1a;盐、味精、胡椒粉 做法&#xff1a;1&#xff0c;南瓜切块&#xff0c;青椒切块&#xff1b;2&#xff0c;油烧至6成熟&#x…

计算机机房t4,机房等级-T2-T3-T4-如何划分

如何在众多的IDC服务商中的辨别出服务器和机房环境的好坏呢?小编告诉大家有这么个指标是我们在选购服务器的时候可以参考&#xff0c;且具有权威性的。国际正常时间协会(the Uptime Institute&#xff0c;简称UI)依据数据中心基础设施的可用性把机房划分为四个级别&#xff1a…

在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体

N 1问题是使用ORM解决方案时的常见问题。 当您将某些OneToMany关系的fetchType设置为lazy时&#xff0c;会发生这种情况&#xff0c;以便仅在访问Set / List时才加载子实体。 假设我们有一个具有两个关系的Customer实体&#xff1a;每个客户的一组订单和一组地址。 OneToMany…

JetBrains系列IDE快捷键大全(转载)

编辑 快捷键组合说明Ctrl Space代码自动完成提示&#xff08;选择&#xff09;Alt Enter显示意图动作和快速修复Ctrl P参数信息 &#xff08;在调用方法参数忘记的时候&#xff0c;提示&#xff09;Ctrl Q快速查找文件&#xff0c;可以查找当前类定义的文件等Ctrl 鼠标滑过…

Vs Code 配置C/C++ 开发环境

第一步&#xff1a;下载 Vs Code 点击链接下载Vs Code 下载版本 并安装 https://code.visualstudio.com/ 点击 Download for Windwos 安装时 如图&#xff1a;请一定要勾选 添加到PATH (环境变量&#xff09; 其他选项可根据个人需要选配 但建议全部勾选 第二步&#xf…

28. css样式中px转rem

Vue3:脚手架配置 https://blog.csdn.net/weixin_41424247/article/details/80867351 与原来的vue-cli 2.x版本不同的是&#xff1a;如果使用最新版本的vue/cli初始化vue项目时&#xff0c;通常看不到webpack的配制文件。而在原来的2.x版本&#xff0c;我们可以在utils.js中轻…

集合已修改;可能无法执行枚举操作。

在对某个List进行遍历的同时&#xff0c;需要对其中的Item进行删除操作。 会提示错误&#xff1a;集合已修改&#xff1b;可能无法执行枚举操作 Codeforeach (VirtualTDate vtDate in tempList){ if (vtDate.Date itemTime.Date) { tempList.Remove(vtDate); …

UI测试脸型软件,App脸型美化剖析|UI-影视-其他|观点|freshoil - 原创文章 - 站酷 (ZCOOL)...

本文基于市面上多款App的美颜效果&#xff0c;做了一个对比分析&#xff0c;整理出一个可以指导美颜调教的参考规范。研究的几个要点如下&#xff1a;1.通过对 某陌、某音、某Y、某他相机、某天P图的效果对比分析2.本次只针对默认效果做对比(某Y无默认则选择自然)3.统一使用前置…

使用Docker,Chef和Amazon OpsWorks进行集群范围的Java / Scala应用程序部署

Docker非常适合在单个节点上运行隔离的容器。 但是&#xff0c;大多数软件系统都在多个节点上运行&#xff0c;因此&#xff0c;除了Docker之外&#xff0c;我们还需要某种方法来指定哪些容器应在哪些节点上运行。 我要解决的特定问题如下&#xff1a;我有两个Scala守护程序&a…

根据输入成绩显示成绩等级(新手)

//导入包。 import java.util.Scanner; //定义一个类。 public class zy238{    //公共静态的主方法。 public static void main(String[] args){ //打印提示。     System.out.println("请你输入成绩"); //为其创建变量。     Scanner sc new Scanner(Sy…

Tmux: 打造精致与实用并存的终端

由于最近需要经常 ssh 到远程环境&#xff0c;遂趁此折腾了一番 tmux。毕竟 工欲善其事&#xff0c;必先利其器 以下是我的配置文件地址&#xff0c;并在不断摸索与更新中。特别喜欢 solarized 主题&#xff0c;于是参考它配了状态栏的主题。在后边我会列出一些平时使用的技巧&…

8、路由 router

路由:router 用户功能 /user ----> index.html /user/login ----> login.html /user/reg ----> reg.html /user userRouter > express.Router(); app.use("/user",userRouter); 新闻功能 /news ----> index.html /news/edit ----> edit.ht…

服务器装虚拟化平台,vmware服务器虚拟化方案(vmware虚拟化平台部署)

服务器虚拟化平台方案主要的有三种&#xff0c;特点分别如下&#xff1a;1、思杰Citrix XenServer :XenCenter是Citrix的虚拟化图形接口管理工具&#xff0c;可在同一界面&#xff0c;管理多台的XenServer服务。以前见过一台服务器安装虚拟服务器&#xff0c;然后可以装N个系统…

一个逐步“优化”的范例程序(转)

reference URL&#xff1a;http://www.tracefact.net/Software-Design/A-Sample-Design.aspx本文是《Object-Oriented Analysis and Design》一书第一章和第五章的读书笔记。我对书中提供的一个范例程序进行了总结和整理&#xff0c;通过逐步优化这个乐器管理的范例程序&#x…

Java SE 8新特性导览:使用Lambda Expression进行函数式编程

“ Java SE 8新功能浏览 ”系列的这篇文章将深入了解Lambda表达式 。 我将向您展示Lambda表达式的几种不同用法。 它们都具有功能接口的共同实现。 我将解释编译器如何从代码中推断信息&#xff0c;例如特定类型的变量以及后台实际发生的情况。 在上一篇文章“ Java SE 8新功能…

JS 数据转换

转换成字符串类型 toString() var num 5;console.log(num.toString()); String() String()函数存在的意义&#xff1a;有些值没有toString()&#xff0c;这个时候可以使用String()。比如&#xff1a;undefined和null 拼接字符串方式 num ""&#xff0c;当 两边一…