Привязка даты в springmvc в формате гггг-мм-дд

1
<tr class="rowsAdded">
        <td><input name="item" class="form-control" type="text" placeholder="Item" /></td>
        <td><input name="amount" class="form-control" type="number" placeholder="Amount" /></td>
        <td><input name="expenseDate" class="form-control" type="date"placeholder="ExpenseDate" /></td>
</tr>

Ниже мой контроллер и Init Binder

@RequestMapping (value = "/saveExpenses", method=RequestMethod.POST)
    public String saveExpenses (@RequestBody ExpenseDetailsListVO expenseDetailsListVO, Model model,BindingResult result) {
        if (result.hasErrors()) {
            System.out.println(result.getFieldError().getField().toString()+" error");
        }
        System.out.println(expenseDetailsListVO);       
        return "success";
    }

@InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     dateFormat.setLenient(false);
     webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
     }

Таким образом, формат даты, который я хочу, не работает, это результат того, что я получаю. AccountDate = Wed Mar 18 05:30:00 IST 2015 Но я хочу, чтобы он был в определенном формате, таком как yyyy-MM-dd... предложите мне способ сделать это.

  • 1
    Я полагаю, ваш класс ExpenseDetailsListVO имеет член типа Date. Когда вы вызываете println для costDetailsListVO, он просто вызывает метод toString () этого члена Date. Ваше связующее не имеет никакого отношения. Следовательно, вы получаете String представление даты по умолчанию. Вы можете либо изменить способ печати вашего объекта, либо использовать новый класс, который расширяет Date, но с другим toString (), для хранения даты ваших расходов.
  • 0
    Да, вы правы ... член имеет тип Date, потому что в бэкэнде он также имеет тип date, поэтому при преобразовании из VO в DO это будет легко ... так что мне теперь делать ??
Показать ещё 1 комментарий
Теги:
spring
spring-mvc

3 ответа

6

Разве это не будет проще?

Entity или Form-Backing-Object:

class Foo {

  /* handles data-binding (parsing) and display if spring form tld or spring:eval */
  @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
  private Date expenseDate;

  ...
}

В форме:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

<form:form modelAttribute="modelAttributeName">
  <form:input type="date" path="expenseDate" />
</form:form>

Или просто для отображения:

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>

<spring:eval expression="modelAttributeName.expenseDate" />

Некоторые педантичные заметки:

  1. Используйте CSS для макетов, а не для таблиц. См. Систему сетки Bootstrap.
  2. Используйте шаблон Post-Redirect-Get для форм.
  3. Используйте taglib Spring Form для правильного вытеснения HTML и защиты CSRF
  4. Используйте @Validated в методах обработчика контроллера для проверки
  5. Вам не хватает места перед "заполнителем" в вашей форме

См. Мой пост здесь для лучших практик: Spring MVC: проверка, пост-перенаправление-получение, частичные обновления, оптимистический параллелизм, безопасность на местах

2

Я не знаю, помогает ли этот ответ вам или нет? Один из моих сущностных классов, как показано ниже...

@Entity
@Table(name = "TAIMS_INC_INCIDENT")
public class Incident implements Serializable{

    @DateTimeFormat(pattern = "dd/MM/yyyy") // This is for bind Date with @ModelAttribute
    @Temporal(TemporalType.DATE)
    @Column(name = "inc_date")
    private Date incidentDate;

}

И Input Like this.. Изображение 174551

<input type="text" id="incident-date" name="incidentDate" value="23/08/2017" />

Метод весеннего контроллера здесь..

    @RequestMapping(value = "/saveIncident.ibbl", method = RequestMethod.POST)
    public ModelAndView saveIncident(
                @ModelAttribute("incident")
                Incident incident,
                BindingResult result){

                System.out.println(incident.getIncidentDate());
                // Wed Aug 23 00:00:00 BDT 2017

    }

Это работает нормально. Incident incident Содержит инцидент Дата = ср. 23 авг. 00:00:00 БДТ 2017

Если вы не хотите использовать @DateTimeFormat(pattern = "dd/MM/yyyy") в классе Entity, тогда поставьте метод ниже в классе контроллера...

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }
0

Я говорю, что ваше связующее, вероятно, прекрасно работает. Что он делает, так это взять строку в формате yyyy-MM-dd из вашего тела запроса HTTP и преобразовать его в объект Date. Но это все. То, что вы делаете с этим объектом Date после этого, зависит от вас. Если вы хотите передать его в виде строки в какую-либо другую часть вашей программы, вы должны ее преобразовать, возможно, используя SimpleDateFormatter.

  • 0
    Эй, спасибо за предложение! Тело HTTP-запроса связывает его в формате гггг-ММ-дд, но можно ли изменить его формат до того, как произойдет связывание, как в этом формате дд-ММ-гггг
  • 0
    Вы можете оставить его тип в виде String, после чего в своем компоновщике сначала преобразуйте его в Date, а затем обратно в формат String, который вам действительно нужен. Я должен сказать, что это кажется довольно странным, но, поскольку вы не предоставили никакой информации о том, что именно вы хотите сделать с этой датой, я не могу делать никаких других предложений
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню