Spring MVC Validator typeMismatch - PullRequest
0 голосов
/ 28 мая 2018

Я создал проект Spring MVC в Eclipse Juno.Контроллер как показано:

@Controller
public class JftController {

    @Autowired
    JenisJftManager jenisJftManager;

    @Autowired
    JftManager jftManager;

    @Autowired
    JftValidator jftValidator;

    @InitBinder
    private void initBinder(WebDataBinder binder){
        binder.setValidator(jftValidator);
    }

    @RequestMapping(value = "/jft/view", method = RequestMethod.GET)
    public String getAll(Model model){
        model.addAttribute("jftList", jftManager.getAll());
        return "jftView";       
    }

    @RequestMapping(value = "/jft/add", method = RequestMethod.GET)
    public String formJft(Model model){
        Map<Integer, String> jenisJft = jenisJftManager.getAllJenisJftMap();            
        model.addAttribute("jft", new Jft());
        model.addAttribute("jenisJft", jenisJft);
        return "jftAdd";        
    }

    @RequestMapping(value = "/jft/add", method = RequestMethod.POST)
    public String addJft(@Validated @ModelAttribute("jft") Jft jft, BindingResult bindingResult, Model model, final RedirectAttributes redirectAttributes){
        System.out.println("1");
        System.out.println("2");
        if (bindingResult.hasErrors()){
            System.out.println("2.1");
            Map<Integer, String> jenisJft = jenisJftManager.getAllKelasMap();
            model.addAttribute("jenisJft", jenisJft);

            for (Object object : result.getAllErrors()) {
                if(object instanceof FieldError) {
                    FieldError fieldError = (FieldError) object;
                    System.out.println("FieldError = "+fieldError.getCode());
                }
                if(object instanceof ObjectError) {
                    ObjectError objectError = (ObjectError) object;
                    System.out.println("ObjectError = "+objectError.getCode());
                }
            }           
            return "jftAdd";
        } else {
            System.out.println("2.2");
            jftManager.add(jft);
            redirectAttributes.addFlashAttribute("message", "Jabatan Fungsional Berhasil ditambah!");
            return "redirect:/jft/view";
        }
    }   

}

Форма как показано ниже:

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html lang="en">
  <head>            
    <title>Untitled</title>    
    <link rel="stylesheet" type="text/css" href="<c:url value='/resources/css/main.css' />">    
    <link rel="stylesheet" type="text/css" href="<c:url value='/resources/css/font-awesome.min.css' />">
    <link rel="icon" type="image/png" sizes="16x16" href="<c:url value='/resources/images/favicon.png' />">
  </head>
  <body class="app sidebar-mini rtl">                         
    <form:form method="POST" class="form-horizontal" action="" modelAttribute="jft">        
    <div class="tile-body">              
      <div class="form-group row">
        <label class="control-label col-md-3">Nama Jabatan Fungsional</label>
        <div class="col-md-8">
          <form:input path="name" class="form-control" cssErrorClass="form-control is-invalid" maxlength="60" />
          <form:errors path="name" class="form-control-feedback" />                    
        </div>
      </div>
      <div class="form-group row">
        <label class="control-label col-md-3">Kelas Jabatan</label>
        <div class="col-md-8">                                                                                                         
          <form:select path="jenis" items="${jenisJft}" class="form-control" />                                   
        </div>
      </div>          
    </div>
    <div class="tile-footer">
      <div class="row">
        <div class="col-md-8 col-md-offset-3">
          <button class="btn btn-primary" type="submit"><i class="fa fa-fw fa-lg fa-check-circle"></i>Tambah</button>
        </div>
      </div>
    </div>
    </form:form>            
  </body>
</html>

Модель Jft показана ниже:

public class Jft {
    public Integer id;
    public String name; 
    public JenisJft jenis;  

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   

    public JenisJft getJenis() {
        return jenis;
    }

    public void setJenis(JenisJft jenis) {
        this.jenis = jenis;
    }   
}

И модель JftJenisпоказано ниже:

public class JenisJft {
    public Integer id;
    public String name;
    public Boolean isDeleted;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean getIsDeleted() {
        return isDeleted;
    }

    public void setIsDeleted(Boolean isDeleted) {
        this.isDeleted = isDeleted;
    }

}

Когда я отправляю форму, bindingResult имеет ошибку.На самом деле я знаю причину.Проблема в том, что Spring Validator пытается сопоставить тип данных для Jft.jenis.Возвращаемое значение из HTML-формы - Integer, но Jft.jenis - не Integer, а JenisJft.Вывод из Apache Tomcat показан ниже: enter image description here

Я гуглю это, но все еще не нашел ответ.Как это решить?Как я могу отобразить это целочисленное значение из HTML в JenisJft?

...