Spring mvc результат привязки отправки формы вызывает ошибку - PullRequest
0 голосов
/ 10 июля 2020

Итак, мой результат привязки выдает ошибку, но я по какой-то причине не могу ее увидеть и не могу понять, в чем проблема. Я предполагаю, что проблема заключается в переменной targetDate, где есть проблема типа. Я вставил свой контроллер и код JSP ниже. Любая помощь приветствуется!

@Controller
public class ToDoController {
    
    @Autowired
    private ToDoService service;
    
    // All date parameters displayed as mm/DD/yyyy
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("mm/DD/yyyy");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(
                dateFormat, false));
    }
    
    @RequestMapping(value = "/list-todo", method= RequestMethod.GET)
    // HttpSession allows access to the session
    public String showToDo(ModelMap model,  HttpSession httpSession) {
        String user = (String) httpSession.getAttribute("name");
        model.addAttribute("todos", service.retrieveTodos(user));
        return "list-todos";
    }
    
    // redirect to update form
    @RequestMapping(value = "/update-todo", method= RequestMethod.GET)
    public String getUpdateForm(ModelMap model, @RequestParam int id) {
    
        System.out.println("ID " + id);
        // To work with command bean
        model.addAttribute("id", id);
        model.addAttribute("todo", service.retrieveTodo(id-1));
        return "updateToDo";
    }
    
    // What does Valid do?
    @RequestMapping(value = "/update-todo", method= RequestMethod.POST) 
    public String submitUpdate(ModelMap model, @Valid ToDo todo, BindingResult result) {
        if (result.hasErrors()) {
            System.out.println("ERROR" + result.getAllErrors());
            // Redirect and pass on the id value
            return "redirect:/update-todo?id=" + todo.getId();
        }
        
        System.out.println("Update todo" + todo);
        service.updateToDo(todo);
        model.clear();
        return "redirect:/list-todo";
    }
    
    // Will be executed first
    @RequestMapping(value = "/add-todo", method= RequestMethod.GET)
    public String showAddForm(ModelMap model) {
        model.addAttribute("todo", new ToDo());
        return "addToDo";
    }
    
    
    /*
     * Will be executed after form is submitted
     * @Valid ToDo - command bean from addToDo.jsp. 
     * @Valid to validate the information
     * @BindingResult showcases the result of the validation
     */
    @RequestMapping(value = "/add-todo", method= RequestMethod.POST)
    public String submitAddForm(ModelMap model , @Valid ToDo todo,  HttpSession httpSession, BindingResult result) {
        System.out.println("running" + result);
        // If there is validation error , return to addToDos page for user to fix the error
        if (result.hasErrors()) {
            return "redirect:/showAddForm?id=?" + todo.getId();
        }
        String user = (String) httpSession.getAttribute("name");
        
        service.addTodo(user, todo.getDescription(), todo.getTargetDate(), false);      
        // Clears the url e.g. name?=jyj123
        model.clear();
        // return to the url which executes the showToDO
        return "redirect:/list-todo";
    }
    
        // delete to do entry
     @RequestMapping(value = "/delete-todo", method= RequestMethod.GET) 
     public String deleteToDo(ModelMap model, @RequestParam int id) { 
         service.deleteTodo(id);
         model.clear();
         return "redirect:/list-todo"; }
     
     
}

My JSP

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ include file = "common/header.jspf" %>
<%@ include file = "common/nav.jspf" %>
    <div class="container">
        <H1>Update your task!</H1>
    
        <form:form method="POST" commandName="todo">
            <!-- Carry on the id value  -->
            <form:hidden path = "id"/>
    <form:hidden path = "user"/>
            <fieldset class="form-group">
                <form:label path="description">Description:</form:label>
        
                <form:input path="description" type="text" class="form-control"
                    required="required" />
                <form:errors path="description" cssClass="text-warning" />
            </fieldset>

            <fieldset class="form-group">
                <form:label path="targetDate">Target Date</form:label>
                <form:input path="targetDate" type="text" class="form-control"
                    required="required" />  
                <form:errors path="targetDate" cssClass="text-warning" />

            </fieldset>
            <fieldset class="form-group"> 
                <form:radiobutton path="completion" value="true" />
                <form:radiobutton path="completion" value="false" />
            </fieldset>

            <button type="submit" class="btn btn-success" >Submit Update</button>
        </form:form>
<spring:hasBindErrors htmlEscape="true" name="todo">
    <c:if test="${errors.errorCount gt 0}">
    <h4>The error list :</h4>
    <font color="red">
      <c:forEach items="${errors.allErrors}" var="error">
        <spring:message code="${error.code}"
                        arguments="${error.arguments}"
                        text="${error.defaultMessage}"/><br/>
      </c:forEach>
    </font>
  </c:if>   
</spring:hasBindErrors>
    </div>
<%@ include file = "common/footer.jspf" %>

EDIT: bindingresult выбрасывает это

ERROR[Field error in object 'todo' on field 'targetDate': rejected value [Tue Jan 05 00:00:00 SGT 2021]; codes [typeMismatch.todo.targetDate,typeMismatch.targetDate,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [todo.targetDate,targetDate]; arguments []; default message [targetDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'targetDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value 'Tue Jan 05 00:00:00 SGT 2021'; nested exception is java.lang.IllegalArgumentException]]

1 Ответ

0 голосов
/ 10 июля 2020

В вашем jsp вы отправляете форму в «todo», а не в «update-todo». Было бы здорово увидеть ваш бин ToDo. Также: result.getAllErrors ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...