BindingResult即使没有null或验证也需要输入日期

时间:2016-12-21 10:54:28

标签: spring jsp spring-mvc

我在Spring中遇到了一个Web应用程序的问题。 我正在编写一个带有相关控制器和服务的搜索jsp表单。 我不需要一些数据是必要的,它一切都很好,但日期。 它要求我在日期输入标签中插入日期,如果我将那些框留空,我在BindingResult中出错并且我的搜索服务停止。 为什么它不接受空值? 在域中,属性未设置为NotNull,我甚至从服务中删除@Valid注释,但它确实继续询问我在该字段中的一些数据。 任何人都可以试着解释一下我应该在哪里解决这个问题? 这是代码: jsp表格:

<form:form commandName="colloquioRicerca" action="colloquio_ricerca"   method="post">
<fieldset>
    <legend>Cerca un colloquio</legend>
    <p class="errorLine">
        <form:errors path="codiceFiscale" cssClass="error"/>
    </p>
    <p>
        <label for="codiceFiscale">Codice Fiscale del Docente: </label>
        <form:input id="codiceFiscale" path="codiceFiscale" tabindex="1"/>
    </p>
    <h5>Ricerca avanzata:</h5>
    <p>
        <label for="nome">Nome:<br><small>(accetta parziali)</small> </label>
        <form:input id="nome" path="nome" tabindex="2"/>
    </p>
    <p>
        <label for="cognome">Cognome:<br><small>(accetta parziali)</small></label>
        <form:input id="cognome" path="cognome" tabindex="3"/>
    </p>
    <p>
        <label for="dataColloquio">Cerca per data: </label>
        <form:input id="dataColloquio" path="dataColloquio" tabindex="4" placeholder="dd/MM/yyyy"/>
    </p>
    <p>Cerca per periodo:</p>
    <p>
        <label for="dataIniz">Dal:</label>
        <form:input id="dataIniz" path="dataIniz" tabindex="5" placeholder="dd/MM/yyyy"/>
        <label for="dataFin">Al:</label>
        <form:input id="dataFin" path="dataFin" tabindex="6" placeholder="dd/MM/yyyy"/>
    </p>
    <p>

        <label for="esitoColloquio">Al:</label>
        <form:input id="esitoColloquio" path="esitoColloquio" tabindex="7" placeholder="dd/MM/yyyy"/>

    <!--
        <label for="esitoColloquio">Esito del Colloquio:</label>
        <form:select id="esitoColloquio" name="esitoColloquio" path="esitoColloquio" tabindex="7">
            <form:option  value="positivo" >Positivo</form:option>
            <form:option  value="negativo" >Negativo</form:option>
            <form:option  value="altro"></form:option>
        </form:select>-->
    </p>
    <p id="buttons">
        <input id="reset" type="reset" tabindex="8">
        <input id="submit" type="submit" tabindex="9" 
            value="Search">
    </p>
</fieldset>
</form:form>

域:

public class ColloquioSearch {

@Size(min=16, max=16)
private String codiceFiscale;
private String nome;
//@Size(min=1, max=50)
private String cognome;
private Date dataColloquio;
private Date dataIniz;
private Date dataFin;
private String esitoColloquio;

服务:

    public List<Colloquio> getAllColloquio() 
        throws SQLException {
    List<Colloquio> result = new ArrayList<Colloquio>();
    Statement s= con.createStatement();
    ResultSet rs = s.executeQuery(
            "SELECT doc.codice_fiscale, col.data_colloquio, col.esito_colloquio, col.note_colloquio FROM colloqui_pj col, docenti_pj doc where doc.id_docente=col.id_docente");         
    while(rs.next());{// il getTime per convertirla in util.date
        result.add(new Colloquio(rs.getString(1), rs.getTime(2), rs.getString(3), rs.getString(4)));
        System.out.println("rs has next");
    }
    return result;    
}

通过提交按钮调用的搜索方法:

     @RequestMapping(value="prova")
 public String goSearch(Model model){
     logger.info("here we are");
     model.addAttribute("colloquioRicerca", new ColloquioSearch());
     return "ColloquioSearchForm";
 }
 @RequestMapping(value="colloquio_ricerca")
 public String cerca(@ModelAttribute ColloquioSearch colloquioRicerca, BindingResult br, Model model){
     logger.info("modelattribute:"+colloquioRicerca.toString()+"/"+colloquioRicerca.getCodiceFiscale());
     logger.info("entered");
     if (br.hasErrors()) {
            FieldError fieldError = br.getFieldError();
            logger.info("Code:" + fieldError.getCode() + ", object:"
                    + fieldError.getObjectName() + ", field:"
                    + fieldError.getField()+"siamo qui");
            model.addAttribute("colloquioRicerca", colloquioRicerca);
            return "ColloquioSearchForm";
     }//validare datafine minore data inizio
     String codiceFiscale = colloquioRicerca.getCodiceFiscale();/*
     Date dataColloquio = colloquioRicerca.getDataColloquio();
     Date dataIniz = colloquioRicerca.getDataIniz();
     Date dataFin = colloquioRicerca.getDataFin();*/
     String nome = "%"+colloquioRicerca.getNome()+"%";
     String cognome = "%"+colloquioRicerca.getCognome()+"%";
     String esitoColloquio = colloquioRicerca.getEsitoColloquio();
     Colloquio colloquioTrovato = null;
     logger.info("siamo prima dell'if isEmpty");
     if (!codiceFiscale.isEmpty()){
         logger.info("dentro if is empty");
         try{
             logger.info("dentro il try:"+colloquioRicerca.getCodiceFiscale());
         List<Colloquio> lista = colloquiService.getAllColloquio();
         if(lista.isEmpty()){logger.info("lista nulla");}
         for(Colloquio colloquio : lista){
             logger.info("colloquio su db cf:"+colloquio.getCodiceFiscale());
             if(colloquio.getCodiceFiscale().equals(codiceFiscale)){
                 colloquioTrovato=colloquio;
                 logger.info("siamo dentro l'if: colloquio trovato"+colloquioTrovato.getCodiceFiscale());
             }
         }
         }
         catch(SQLException e){logger.info(e.getMessage()+"siamo qui?");}
     }
     if (colloquioTrovato == null){
         model.addAttribute("colloquioRicerca", colloquioRicerca);
         return "ColloquioSearchForm";
     }
     return "Daje";
 }

以下是jsp处理停止时我在控制台中遇到的错误:

     /*dic 21, 2016 9:52:00 AM project.controller.ColloquioSearchController cerca
INFORMAZIONI:    modelattribute:project.domain.search.ColloquioSearch@5d2ca87b/hereitwritesthecorrectparam
dic 21, 2016 9:52:00 AM project.controller.ColloquioSearchController    cerca
INFORMAZIONI: entered
dic 21, 2016 9:52:00 AM project.controller.ColloquioSearchController cerca
INFORMAZIONI: Code:typeMismatch, object:colloquioSearch,  field:dataColloquiosiamo qui
dic 21, 2016 9:52:00 AM org.springframework.web.servlet.tags.form.InputTag doStartTag
GRAVE: Neither BindingResult nor plain target object for bean name  'colloquioRicerca' available as request attribute*/ 
above is the error I got in console since i leave empty the date fields on form; I got the error for DataColloquio, then for DataFin, and then for DataIniz, subsequently. The only way to avoid this error is by filling the form imput fields related

我希望能够进入本网站的行列,谢谢大家。

PS:我知道代码结构不好,并不是编写代码的好方法,我只想解释问题,同时我正在改变结构,我只是不明白为什么呢要求我不要留空日期字段,而不是其他字段。

1 个答案:

答案 0 :(得分:0)

如果你打印这些

可能会更好
 Date dataColloquio = colloquioRicerca.getDataColloquio();
 Date dataIniz = colloquioRicerca.getDataIniz();
 Date dataFin = colloquioRicerca.getDataFin();

直接在您的控制器中,因为我有点怀疑spring会将您输入的字符串格式解析为 Date 对象而无需自定义。

简而言之,如果你想绑定Date字段,你可以通过 WebDataBinder 注册日期的自定义数据绑定,只需添加

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

在您的控制器中,即使您的输入为空,春天也会为您完成剩下的工作。您必须注意格式为 yyyy-MM-dd ,或者只是根据需要进行更改。作为替代方案,您也可以

@DateTimeFormat(pattern = "yyyy-MM-dd") // Spring 4.0
 private LocalDate dataColloquio;
@DateTimeFormat(pattern = "yyyy-MM-dd") // Spring 4.0
private LocalDate dataIniz;
@DateTimeFormat(pattern = "yyyy-MM-dd") // Spring 4.0
private LocalDate dataFin;

关于你的错误,这可能是由你的服务造成的,因为那里有一个 rs.getTime(..) ,同时输入的字符串日期无法正确解析为Date对象,因此你的模型对象不能被瞄准因此抛出错误。如我之前的建议,尝试将上面给出的 @InitBinder 带注释的方法放入您的控制器中,让我们希望它能解决所有问题。