2016-12-21 68 views
0

我在Spring中遇到了一個Web應用程序的問題。 我正在寫一個搜索jsp表單與相關的控制器和服務。 我不需要一些數據是必要的,它會一切正常,但日期。 它需要我將日期插入到日期輸入標記,如果我將這些框留空,我在BindingResult中出現錯誤,並停止搜索服務。 它爲什麼不接受空值? 在域中,屬性沒有設置爲NotNull,我甚至從服務中刪除了@Valid註釋,但它不斷向我詢問一些數據到這些域中。 任何人都可以試圖解釋我在哪裏可以解決這個問題? 下面是代碼: JSP形式:BindingResult需要日期輸入,即使不爲空或驗證

<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:[email protected]/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:我知道代碼結構不好,它不是編寫寫入方式的好方法,我只是想解釋問題,同時我正在改變結構,我只是不明白爲什麼它要求我不要留下空的日期字段,而不是其他字段。

回答

0

,如果您直接在控制器打印這些

Date dataColloquio = colloquioRicerca.getDataColloquio(); 
Date dataIniz = colloquioRicerca.getDataIniz(); 
Date dataFin = colloquioRicerca.getDataFin(); 

它可能會更好,因爲我有點懷疑,春天會解析您的輸入來的字符串格式爲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對象。因此您的模型對象不能被瞄準,因此拋出錯誤。正如前面我的建議,試着把上面給出的註釋方法放到控制器中,讓我們希望它能解決所有問題。

+1

謝謝,你的幫助一直有用。 –

+0

我解決了這個問題,無論如何我改變了應用程序的集合,所以它現在使用格式化程序,但是你的建議工作。 –

+0

@ 3lm3lm,你介意花時間閱讀[this](http://meta.stackoverflow.com/questions/251288/dealing-with-an-answer-that-wasnt-accepted-maybe-because-a-user - 這是一個新手上),所以它給了你一個想法,我們是誰在SO貢獻者。你可以跳過我的回答,但是希望你不要這樣做給下一個在下一個問題上花時間解決你的問題的競爭者,特別是如果他們爲你提供工作解決方案/提示/想法。看着你,保重。 –