2016-08-27 3 views
4

Текущая логика проверяет наличие ошибок BindingResult и отображение данных и ошибок в jsp. Необходимая логика - это проверка ошибок для каждой строки и отображение только тех строк, содержащих ошибки проверки, и обновление строк, которые не имеют ошибок проверки. @Autowired частный инцидент IncidentExtractStgServiceExtractStgService;Как проверить, имеет ли определенная строка ошибку проверки для проверки нескольких строк весной, используя BindingResult

@RequestMapping(value = "/validatingIncidentList", method = RequestMethod.POST) 
public String ValidateIncidentList(@Valid @ModelAttribute("incidentsForm") IncidentsForm incidentsForm, 
     BindingResult bindingResult,RedirectAttributes redirectAttributes) { 
    if (bindingResult.hasErrors()) { 


     for(ObjectError error: bindingResult.getAllErrors()){ 

      System.out.println(error); 
     } 

     redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.incidentsForm", bindingResult); 
     redirectAttributes.addFlashAttribute("incidentsForm", incidentsForm); 

     return "redirect:/validateIncidentList"; 
    } 
    else 
    { 
     for(IncidentExtractStg ie : incidentsForm.getIncidents()) { 

      ie.setValidated(1); 
      incidentExtractStgService.update(ie); 

      System.out.println(ie.getNumber()+"  "+ie.getWaitTime()); 
     } 


    return "redirect:/validateIncidentList"; 

    } 

Ниже фрагмент кода будет проверять, если модель содержит атрибут «incidetsForm», если так будет посылать то же самое example.jsp, который в свою очередь будет отображать данные и ошибки проверки.

@RequestMapping(value = "/validateIncidentList", method = RequestMethod.GET) 
public String incidentList(Model model) { 
    if (!model.containsAttribute("incidentsForm")) { 
      List<IncidentExtractStg> incidents = incidentExtractStgDao.validateList(); 
      incidentsForm.setIncidents(incidents); 
      model.addAttribute("incidentsForm", incidentsForm); 
      return "example"; 
    } 

    model.addAttribute("errormessage","Please Check the Validation Errors column for Errors"); 
    return "example"; 
} 

Example.jsp фрагмент кода

<c:forEach var="ie" items="${incidentsForm.incidents}" varStatus="status"> 
      <tr> 
        <td><form:input path="incidents[${status.index}].id" value="${ie.id}" readonly ="true"/></td> 
       <td><form:errors path="incidents[${status.index}].id" cssClass="error" /></td> 

       <td><form:input path="incidents[${status.index}].number" value="${ie.number}"/></td> 
       <td><form:errors path="incidents[${status.index}].number" cssClass="error" /></td> 
      </tr> 

IncidentsForm.java:

import java.util.List; 
import javax.validation.Valid; 

import com.infosys.sla.model.IncidentExtractStg; 

public class IncidentsForm { 

@Valid 
private List<IncidentExtractStg> incidents; 



public List<IncidentExtractStg> getIncidents() { 
    return incidents; 
} 


public void setIncidents(List<IncidentExtractStg> incidents) { 

    this.incidents = incidents; 
} 
} 

IncidentExtractStg.java фрагмент

@Entity 
@Table(name="incident_extract_stg") 
public class IncidentExtractStg { 

@Id 
@Column(name="ies_id") 
private int id; 

@NotBlank(message="number cannot be empty") 
@Pattern(regexp="[A-Za-z0-9]*",message="number can contain only alphabets and numbers") 
@Column(name="ies_number") 
private String number; 
+0

Вы можете найти логику, необходимую для ваших нужд внутри вопроса или ответов этой темы: http://stackoverflow.com/questions/25326591/spring-mvc-controller-how-to-keep-bindingresult-errors- while-emptying-the-form – ThierryB

ответ

0

Поскольку логика отображает только те строки, содержащие ошибки проверки, создается новый список для хранения строк, которые имеют хотя бы одну ошибку проверки.

Создан новый BindingResult для хранения Ошибок по индексу нового списка. (Если это не сделано, сообщение об ошибке не будет отображаться против отображаемой строки).

Следующая логика - это проверка ошибки поля для каждого поля строки, а из jsp вы можете увидеть, что у зарегистрированного имени есть «инциденты [$ {status.index}]. Id". - Счетчик i, чтобы получить количество строк - Счетчик j - установить индекс для BindingResult.

BeanPropertyBindingResult result2 = new BeanPropertyBindingResult(incidentsForm, bindingResult.getObjectName(); 

    List<IncidentExtractStg> incidents= new ArrayList<IncidentExtractStg>(); 
    int i=0;// to get the row count 
    int j=0;// to set the index 
    for(IncidentExtractStg ies : incidentsForm.getIncidents()) 
    {  
      int count=0; 
      Field[] declaredFields = IncidentExtractStg.class.getDeclaredFields(); 
      for (Field field : declaredFields) 
      { 
       if (bindingResult.hasFieldErrors("incidents["+i+"]."+field.getName())) 
       { 
        for (FieldError error: bindingResult.getFieldErrors("incidents["+i+"]."+field.getName())) 
        { 
        result2.addError(new FieldError(error.getObjectName(), "incidents["+j+"]."+field.getName(), error.getRejectedValue(), error.isBindingFailure(), error.getCodes(), error.getArguments(), error.getDefaultMessage())); 
        } 
       count++; 
       } 
      } 

      if(count>0) 
      { 
       j++; 
       incidents.add(ies);  
      } 
      else 
      { 
       ies.setValidated(1); 
       incidentExtractStgService.update(ies); 
      } 

     i++; 
    } 

    i=0; 
    j=0; 

    if (bindingResult.hasErrors()) { 

     incidentsForm.setIncidents(incidents); 
     System.out.println("error block"); 

     for (FieldError error: result2.getFieldErrors()) { 
      System.out.println("field errors are "+error.getField()); 
      System.out.println("field errors are "+error); 
     } 

     redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.incidentsForm", result2); 
     redirectAttributes.addFlashAttribute("incidentsForm", incidentsForm); 
     return "redirect:/validateIncidentList"; 
    }  

Например: Если в строке № 30 поле инцидентов [30] .number имеет ошибку проверки. Тогда i = 30 и count> 0 и j = 0.

Следовательно, все инциденты в строке [30] будут сохранены с индексом 0 в вновь инициализированном списке, а значение bindingresult также будет добавлено с индексом 0. Если J не установлен в result2 и используется bindingresult, тогда это будет по-прежнему указывать на индекс 30, и сообщение об ошибке не будет отображаться в отношении поля, которое теперь хранится с индексом 0.

Теперь это обновление IncidentsForm и result2 будет отправлено на страницу jsp, в которой будут отображаться только те строки, в которых есть ошибки проверки и есть соответствующие сообщения об ошибках.

1

Прежде всего, если вы были я извлечет все логические входы ide - уровень обслуживания. Чтобы продолжить, вы можете создать интерфейс IncidentService и его собственную конкретную реализацию IncidentServiceImpl, в которой вы можете безопасно справиться со своими потребностями. Контроллеры определенно не сделали все.

Тогда, что вам нужно? «проверить ошибки для каждой строки и отображать только те строки, содержащие ошибки проверки и обновления строки, которые не имеют ошибки проверки»

метод внутри службы слоя может быть так:

public void handleErrors(IncidentsForm incidentsForm, BindingResult bindingResult){ 

    List<String> fieldsInErrorState = new ArrayList<String>(10); 

    if (bindingResult.hasErrors()) { // 
     Map<String, Object> bindingModel = bindingResult.getModel(); 

     for (Map.Entry<String, Object> entry : bindingModel.entrySet()) { 
      String key = entry.getKey(); 
      //Object value = entry.getValue(); you don't need to parse that unless you want specific domain model handlers to run 

      //you need to store the key as a form field which is in error state 
      fieldsInErrorState.add(key); 

      //you already have all the stuff to parse and display errors in your JSP 
      //thanksfully to bindingResult and JSTL tags. 
     } 

     ContactMessageForm cmForm2 = new ContactMessageForm(); 
     // get the list of the fields inside your form 
     Field[] declaredFields = ContactMessageForm.class.getDeclaredFields(); 
     for (Field field : declaredFields) { 
      if (!fieldsInErrorState.contains(field.getName())) { 
       if (field.getName().equalsIgnoreCase("firstname")) { 
        cmForm2.setFirstname(contactMessageForm.getFirstname()); 
       } 
       if (field.getName().equalsIgnoreCase("lastname")) { 
        cmForm2.setLastname(contactMessageForm.getLastname()); 
       } 

       //etc for each properties of your form object. 
      } 

      // then store your dbmodel object 
      // BUT i think you must be carefull to your data integrity... It is maybe not safe to save an object like that with bypassing some stuff... 
      // Your form was built like that maybe for a good reason looking at your objects graph. 
      // If your form is too big, then split it in small parts, it will be much easy to handle, to update, and to work with daily. 
     } 

    } 


} 

Конечно, вам нужно настроить этот код, не забудьте добавить throws IntrospectionException к вашему методу обслуживания, и вы находитесь на хорошем пути.

Приветствия!

+0

Спасибо за предложение, я переместлю handleErrors() в класс Service. «ContactMessageForm», о котором вы говорите, это класс «ИнцидентForm» или «IncidentExtractStg» (Модель). Как указано в названии, форма представляет собой многострочный табличный формат, где в каждой строке будут все поля, доступные в классе модели, поэтому требование состоит в проверке, имеет ли какое-либо поле в этой конкретной строке ошибку проверки, и если это так, что целая строка будет отправлен в Jsp, чтобы отобразить ошибку, и строки, поля которых не имеют проверки. Ошибки должны быть обновлены в БД. – Raghav

+0

Здравствуйте, вам просто нужно перебрать свою коллекцию IncidentExtratStg, чтобы найти любые ошибки привязки. Попробуйте проверить каждую строку с помощью проверок IncidentExtractStg, а затем сохраните их, если не возникнут ошибки. – ThierryB