form
提交发送date
和yyyy-MM-dd
的彭定康到后端。但是可以通过dd-MM-yyyy
发送日期。我正在使用html5
如果将type="text"
更改为type="date"
,则此方法正常工作
我正在尝试发送日期dd-MM-yyyy
,前端如下所示。
提交时,由于发送到后端的值为yyyy-MM-dd
,因此,发生以下错误。 我的代码出问题了吗?
2018-11-16 18:12:20.553警告8925 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver:绑定请求失败 元件: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: 无法将类型“ java.lang.String”的值转换为必需的类型 'java.time.LocalDate';嵌套异常为 org.springframework.core.convert.ConversionFailedException:失败 从类型[java.lang.String]转换为类型 [@ org.springframework.web.bind.annotation.RequestParam @ org.springframework.format.annotation.DateTimeFormat java.time.LocalDate]的值为'2018-11-09';嵌套异常为 java.lang.IllegalArgumentException:尝试解析值失败 [2018-11-09]
以下是代码:
jsp:
<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css"
href="webjars/bootstrap/3.3.7/css/bootstrap.min.css" />
<!--
<spring:url value="/css/main.css" var="springCss" />
<link href="${springCss}" rel="stylesheet" />
-->
<c:url value="/css/main.css" var="jstlCss" />
<link href="${jstlCss}" rel="stylesheet" />
</head>
<body>
<nav class="navbar navbar-inverse">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">Spring Boot</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#about">About</a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="starter-template">
<h1>Spring Boot Web JSP Example</h1>
<h2>Message: ${message}</h2>
<form action="/get" method="post">
<input type="date" name="date" pattern="\d{1,2}/\d{1,2}/\d{4}"><!-- -->
<input type="submit" value="submit">
</form>
</div>
</div>
<!-- /.container -->
<script type="text/javascript"
src="webjars/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
控制器类:
@Controller
public class MyController {
// inject via application.properties
@Value("${welcome.message:test}")
private String message = "Hello World";
@RequestMapping("/")
public String welcome(Map<String, Object> model) {
model.put("message", this.message);
return "welcome";
}
@RequestMapping(value="/get",method={RequestMethod.GET,RequestMethod.POST})
public String get(Map<String, Object> model, @RequestParam(value="date") @DateTimeFormat(pattern ="dd-MM-yyyy") LocalDate date) {
System.out.println("get" + date.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
return "welcome";
}
//this is for testing
@RequestMapping(value="/get1",method={RequestMethod.GET,RequestMethod.POST})
public String get1(Map<String, Object> model, @RequestParam(value="date") String date) {
System.out.println("get1 "+ date);
return "welcome";
}
}
答案 0 :(得分:3)
date
输入value
中的is always in yyyy-MM-dd
format(在browsers that support it上),无论它如何显示给用户。
您最好的选择是更新后端,以了解这种相对明确的格式,而不是较不明确的格式,首先使用月或日(在欧洲大部分地区使用dd/MM/yyyy
,或者在欧洲使用MM/dd/yyyy
在北美大部分地区使用)。我相信这将意味着对您的控制器类进行了更改(但是Spring MVC不是我的主力军):
@RequestMapping(value="/get",method={RequestMethod.GET,RequestMethod.POST})
public String get(Map<String, Object> model, @RequestParam(value="date") @DateTimeFormat(pattern ="dd-MM-yyyy") LocalDate date) {
System.out.println("get" + date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
return "welcome";
}
您可以预处理表单数据客户端以更改格式,但是我不建议这样做。
答案 1 :(得分:0)
编写一个实用程序函数来处理它。
例如调用formatAndReturnDate("30/12/2018","dd/MM/yyyy","yyyy-MM-dd");
public String formatAndReturnDate (String dateValue, String initDateFormat, String endDateFormat) throws ParseException {
Date dateObj = new SimpleDateFormat(initDateFormat).parse(dateValue);
SimpleDateFormat formatter = new SimpleDateFormat(endDateFormat);
String parsedDate = formatter.format(dateObj);
return parsedDate;
}