Spring 4.1和Java 8:java.util.Optional
由于Spring 4.1的Java 8的的java.util.Optional
,容器对象可能会或可能不包含非空值,支持与@RequestParam
, @RequestHeader
和@MatrixVariable
。 使用Java 8的java.util.Optional
请确保参数永远不会为null
。
请求参数
在此示例中,我们将使用@RequestParam
将java.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
批注的支持。 为了启用它,我们需要调整配置并将RequestMappingHandlerMapping
的removeSemicolonContent
属性设置为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
Spring 4.1和Java 8:java.util.Optional相关推荐
- java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- Spring Boot整合Nacos时遇到 java.lang.IllegalStateException: Context has been already given a name 的解决办法
问题概述 在进行项目开发过程中,通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时,遇到个梗,启动时打印出一串错误日志信息 " Failed to rena ...
- dubbo 报错Serialized class com.spring.boot.entity.User must implement java.io.Serializable
这个报错是说dubbo在传输数据的时候反序列化报错, 使用dubbo进行数据传递时,需让作为消息传递的类序列化. 2019-03-26 16:45:01.228 ERROR 14968 --- [ni ...
- java.util类,GitHub - yutaolian/JavaUtils: 总结的一些Java常用的util类
JavaUtils 总结的一些Java常用的util类 ###1.格式化时间 SimpleDateFormat(DateFormat)实现线程安全的使用 众所周知SimpleDateFormat(Da ...
- spring什么版本支持java8,与Java 11兼容的最低Spring版本
I need to upgrade an app to Java 11 very soon, I was wondering what's the minimum Spring version tha ...
- Spring框架面试工作必备锦囊 Java框架-Spring
Spring框架面试工作必备锦囊 Java框架-Spring spring framework 有哪些核心模块? spring-core:spring基础API模块,如资源管理泛型处理 spring- ...
- 【Java】java.util.Objects 工具类方法研究
[Java]java.util.Objects 工具类方法研究 Objects 与 Object 区别 Object 是 Java 中所有类的基类,位于java.lang包. Objects 是 Ob ...
- Java 8 中的 java.util.Optional
Java 8 中的 java.util.Optional 学习了:https://blog.csdn.net/sun_promise/article/details/51362838 package ...
- Java数组– java.util.Arrays
Java Arrays class consists exclusively of static methods that operates on array. Java Arrays类仅由对数组进行 ...
最新文章
- ROS控制无人机offboard模式
- GPU深度发掘(一)::GPGPU数学基础教程
- 浅谈PHP在各系统平台下的换行符
- Python:进阶操作(1)
- b超可以看出什么_【b超能检查出什么】b超能看出男女吗_b超能查出什么妇科病 - 妈妈网百科...
- api 定位 微信小程序 精度_一行代码区分微信小程序或QQ小程序
- setstate是同步还是异步_谈谈 IO模型:同步、异步、阻塞、非阻塞
- JavaWeb学习笔记-kuangshen
- uc手机浏览器 手机模拟_网页为何总报浏览器漏洞?起底某些手机浏览器恶意推广行为...
- jira api java,如何使用其余api(java)在jira中创建问题?
- Bootstrap页面布局18 - BS导航路径以及分页器
- angularJS(二):作用域$scope、控制器、过滤器
- linux声道切换,linux下怎么把数据分别给左右声道
- Resource Hacker软件更换应用图标
- tablet2+android,z2tablet不开机了 怎么处理,索尼Sony Xperia 安卓平板论坛
- Echarts中饼状图显示百分比
- python画樱花树教程_turtle模块-知乎画樱花树
- Unity Shader:Unity网格(1)---顶点,三角形朝向,法线,uv,以及双面渲染三角形
- matlab imresize算法详解,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
- MSP430 UART(一)
热门文章
- 16-就业课(2.1)-应用容器-Docker
- html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果
- 属性 方法c语言,C语言如何实现C++中对象属性和方法
- 前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?
- removeAll throws java.lang.UnsupportedOperationException
- 文档在线签名_为什么需要为文档和合同切换到在线签名
- web.xml.jsf_面向初学者的JSF 2.0教程
- spring3.0异步_在Spring 4.2中更简单地处理异步事务绑定事件
- 关于高效企业测试的思考(1/6)
- 您需要了解的所有有关System.gc()的信息