我有一个像
这样的bean类。import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
public class Form {
private String name;
private Long numID;
private String Address;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate date1;
// getters and setters
}
这在rest控制器类中使用
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
public class MyController {
private String MY_URL = "/model.do"
@RequestMapping(value = {MY_URL}, method = RequestMethod.POST)
@ResponseBody
Public Model getModelType(@ModelAttribute Form myForm){
}
}
现在,当我传递编码为
的阿拉伯日期对象时%D9%A2%D9%A0%D9%A1%D9%A9-%D9%A0%D9%A4-%D9%A1%D9%A5,转换失败并出现以下错误
org.springframework.validation.BindException:org.springframework.validation.BeanPropertyBindingResult:1个错误 字段“ date1”上对象“ form”中的字段错误:拒绝的值[????-??-??];代码[typeMismatch.form.date1,typeMismatch.isoCheckInDate,typeMismatch.java.time.LocalDate,typeMismatch];参数[org.springframework.context.support.DefaultMessageSourceResolvable:代码[form.isoCheckInDate,isoCheckInDate];参数[];默认消息[isoCheckInDate]];默认消息[未能将属性'date1'的类型'java.lang.String'的属性值转换为必需的类型'java.time.LocalDate';嵌套异常是org.springframework.core.convert.ConversionFailedException:无法从类型[java.lang.String]转换为类型[@ org.springframework.format.annotation.DateTimeFormat java.time.LocalDate]的值'??? ?-??-??';嵌套的异常是java.lang.IllegalArgumentException:解析尝试失败的值[????-??-??]]
任何想法如何处理这种情况?
答案 0 :(得分:2)
虽然我不知道Spring框架做了什么,为什么,我可以向您展示如何用纯Java解析字符串:
DecimalStyle defaultDecimalStyle
= DateTimeFormatter.ISO_LOCAL_DATE.getDecimalStyle();
DateTimeFormatter arabicDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE
.withDecimalStyle(defaultDecimalStyle.withZeroDigit('\u0660'));
String encodedArabicDateStr = "%D9%A2%D9%A0%D9%A1%D9%A9-%D9%A0%D9%A4-%D9%A1%D9%A5";
String arabicDateStr
= URLDecoder.decode(encodedArabicDateStr, StandardCharsets.UTF_8);
LocalDate date = LocalDate.parse(arabicDateStr, arabicDateFormatter);
System.out.println("Parsed date: " + date);
此代码段的输出为:
分析日期:2019-04-15
唯一的技巧是告诉格式化程序解析阿拉伯数字。当我们告诉它零位数字(٠
或'\u0660'
)时,它会找出其他数字。