Java

时间:2019-03-05 13:12:05

标签: java spring

我有一个像

这样的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:解析尝试失败的值[????-??-??]]

任何想法如何处理这种情况?

1 个答案:

答案 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')时,它会找出其他数字。