2013-05-29 2 views
0

Мыстрока не поддается синтаксическому анализу: [дата не поддается синтаксическому анализу: "ср 29 мая 16:34:58 ART 2013"] только на удаленном сервере

  1. Один сервер А работает на JBoss EAP6/Windows/США
  2. Другое сервер B, работающий на Jboss EAP6/Linux/Южная Америка

Приложение текущей пружины имеет страницу пользовательского интерфейса, которая передает поле выбора даты, когда нажимает кнопку «Отправить», этот объект даты переходит на следующую страницу как поле java bean.

Сейчас ситуация:

Сервер работает эта форма отлично без проблем, но исключение броска сервер 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 статьи

Интересная часть выше проблема возникает, когда эта дата объект является полем бина

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

Но это работает без проблем в другом контроллере без @InitBinder

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

Но как же эта ошибка все еще случается, даже с этим @initBinder? Я сделал post раньше и кажется, что платформа имеет другой способ перевести код timezone, но Spring, я думаю, что он способен поддерживать интернационализацию правильно?

ответ

0

Пригвожден.

Проблема в основном из-за String к Date преобразования, это либо

  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 

В моем случае, как мы на Спринг рамках так что причина проблемы заключается в том: я не совсем 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 

Я удаляю LocaleContextHolder.getLocale() из sortFormat Initiation, тогда он работает как шарм.Кажется, нам нужно избавиться от System local, чтобы преобразовать дату String, когда строка возврата даты формы возвращается из пользовательского интерфейса в контроллер.

Причина это нормально потому, что printFormat уже заботиться о локали, если положить информацию о дате для UI

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

так, как только дата строка вернуться из пользовательского интерфейса, не нужно обрабатывать с локалью любой из них, и это должно быть хорошо, мы вынимаем локаль для sortFormat. Вот что я думаю.

Cheers.

Смежные вопросы