由于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

Spring 4.1和Java 8:java.util.Optional相关推荐

  1. java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  2. Spring Boot整合Nacos时遇到 java.lang.IllegalStateException: Context has been already given a name 的解决办法

    问题概述 在进行项目开发过程中,通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时,遇到个梗,启动时打印出一串错误日志信息 " Failed to rena ...

  3. 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 ...

  4. java.util类,GitHub - yutaolian/JavaUtils: 总结的一些Java常用的util类

    JavaUtils 总结的一些Java常用的util类 ###1.格式化时间 SimpleDateFormat(DateFormat)实现线程安全的使用 众所周知SimpleDateFormat(Da ...

  5. 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 ...

  6. Spring框架面试工作必备锦囊 Java框架-Spring

    Spring框架面试工作必备锦囊 Java框架-Spring spring framework 有哪些核心模块? spring-core:spring基础API模块,如资源管理泛型处理 spring- ...

  7. 【Java】java.util.Objects 工具类方法研究

    [Java]java.util.Objects 工具类方法研究 Objects 与 Object 区别 Object 是 Java 中所有类的基类,位于java.lang包. Objects 是 Ob ...

  8. Java 8 中的 java.util.Optional

    Java 8 中的 java.util.Optional 学习了:https://blog.csdn.net/sun_promise/article/details/51362838 package ...

  9. Java数组– java.util.Arrays

    Java Arrays class consists exclusively of static methods that operates on array. Java Arrays类仅由对数组进行 ...

最新文章

  1. ROS控制无人机offboard模式
  2. GPU深度发掘(一)::GPGPU数学基础教程
  3. 浅谈PHP在各系统平台下的换行符
  4. Python:进阶操作(1)
  5. b超可以看出什么_【b超能检查出什么】b超能看出男女吗_b超能查出什么妇科病 - 妈妈网百科...
  6. api 定位 微信小程序 精度_一行代码区分微信小程序或QQ小程序
  7. setstate是同步还是异步_谈谈 IO模型:同步、异步、阻塞、非阻塞
  8. JavaWeb学习笔记-kuangshen
  9. uc手机浏览器 手机模拟_网页为何总报浏览器漏洞?起底某些手机浏览器恶意推广行为...
  10. jira api java,如何使用其余api(java)在jira中创建问题?
  11. Bootstrap页面布局18 - BS导航路径以及分页器
  12. angularJS(二):作用域$scope、控制器、过滤器
  13. linux声道切换,linux下怎么把数据分别给左右声道
  14. Resource Hacker软件更换应用图标
  15. tablet2+android,z2tablet不开机了 怎么处理,索尼Sony Xperia 安卓平板论坛
  16. Echarts中饼状图显示百分比
  17. python画樱花树教程_turtle模块-知乎画樱花树
  18. Unity Shader:Unity网格(1)---顶点,三角形朝向,法线,uv,以及双面渲染三角形
  19. matlab imresize算法详解,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
  20. MSP430 UART(一)

热门文章

  1. 16-就业课(2.1)-应用容器-Docker
  2. html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果
  3. 属性 方法c语言,C语言如何实现C++中对象属性和方法
  4. 前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?
  5. removeAll throws java.lang.UnsupportedOperationException
  6. 文档在线签名_为什么需要为文档和合同切换到在线签名
  7. web.xml.jsf_面向初学者的JSF 2.0教程
  8. spring3.0异步_在Spring 4.2中更简单地处理异步事务绑定事件
  9. 关于高效企业测试的思考(1/6)
  10. 您需要了解的所有有关System.gc()的信息