gpt4 book ai didi

java - 无法解析的字符串 : [Unparseable date: "Wed May 29 16:34:58 ART 2013"] only on remote server

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:13 26 4
gpt4 key购买 nike

我们有

  1. 一台服务器 A 在 Jboss EAP6/Windows/US 上运行
  2. 另一台服务器 B 运行在 Jboss EAP6/Linux/南美洲

当前的 spring 应用程序,有一个 UI 页面传递一个日期选择框,当单击提交时,该日期对象将作为 java bean 的字段传递到下一页。

现在的情况是:

服务器A运行这个表单没有问题,但是服务器B在提交时抛出异常:

nested exception is java.lang.IllegalArgumentException: 
Unparseable string: [Unparseable date: "Wed May 29 16:34:58 ART 2013",
Unparseable date: "Wed May 29 16:34:58 ART 2013"]]

服务器 B 似乎不知道如何处理 Wed May 29 16:34:58 ART 2013 的数据格式,即使我添加了 @initBinder

@InitBinder
public void registerDateBinder(WebDataBinder binder) {
DateFormat printFormat = new SimpleDateFormat(DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale())); // format for joda time dojo UI
printFormat.setLenient(false);
DateFormat sortFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy" , LocaleContextHolder.getLocale()); // format for whatever return from form
sortFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new ExpandableCustomDateEditor(printFormat, Arrays.asList(printFormat, sortFormat), true));
}

ExpandableCustomDateEditor 引用自 this文章

有趣的部分是当 Date 对象是 bean 的字段时会发生上述问题

public String showSecondView(Form aForm,
Model uiModel) {
.....
}

但这在另一个没有@InitBinder的 Controller 中工作没有问题

public String list(Model uiModel, 
@RequestParam(value = "fromDate", required = false) Date fromrDate,
.....)
....
}

但是即使使用@initBinder,为什么这个错误仍然发生?我已经做了post之前似乎平台有不同的方式来翻译timezone代码,但是Spring,我认为它能够支持国际化,对吗?

最佳答案

成功了。

问题主要是因为 StringDate 的转换,要么是

  1. DateFormat 对象中定义的格式与日期字符串值不匹配,或者
  2. 当前服务器环境无法通过当前区域设置识别时区代码或其他时间格式

所以

solution to issue1: find the correct Date format, google is best friend
solution to issue2: remove locale from current `DateFormat` object, only use
DateFormat df = new DateFormat(String pattern);
instead of
DateFormat df = new DateFormat(String pattern, Locale aLocale);
when convert String to Date from what return from form

就我而言,由于我们使用 Spring 框架,所以问题的原因是:我并没有100%遵循post所以

@InitBinder
public void registerDateBinder(WebDataBinder binder) {
DateFormat printFormat = new SimpleDateFormat(DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale())); // format for joda time dojo UI
printFormat.setLenient(false);
DateFormat sortFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy" , LocaleContextHolder.getLocale()); // NO LOCALE PlEASE!!!!!!
sortFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new ExpandableCustomDateEditor(printFormat, Arrays.asList(printFormat, sortFormat), true));

}

问题就在这里

DateFormat sortFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); // AFTER REMOVE LOCALE

我从 sortFormat 启动中删除了 LocaleContextHolder.getLocale() ,然后它就像一个魅力一样。当表单从 UI 返回日期字符串到 Controller 时,我们似乎必须摆脱 System local 来转换日期字符串。

之所以没问题是因为 printFormat 在将日期信息放入 UI 时已经处理了区域设置

DateFormat printFormat = new SimpleDateFormat(DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale())); // format for joda time dojo UI

因此,一旦日期字符串从 UI 返回,就无需再进行任何前面的区域设置处理,我们应该可以取出 sortFormat 的区域设置。我也是这么想的。

干杯。

关于java - 无法解析的字符串 : [Unparseable date: "Wed May 29 16:34:58 ART 2013"] only on remote server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com