当前逻辑将检查BindingResult是否有错误,并在jsp中显示数据和错误。所需的逻辑是检查每一行的错误,并仅显示包含验证错误的那些行,并更新没有验证错误的行。@Autowired私人IncidentExtractStgService eventExtractStgService;
@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;
由于逻辑上仅显示那些包含验证错误的行,因此将创建一个新的List来存储具有至少一个验证错误的行。
将创建一个新的BindingResult来存储针对新List索引的Errors(如果不执行此操作,则不会针对显示的行显示错误消息)。
下面的逻辑是针对行的每个字段检查字段错误,从jsp中可以看到文件名具有“ incidents [$ {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行中,incidents [30] .number字段具有验证错误。然后i = 30并计数> 0且j = 0。
因此,整个行的事件[30]将保存在新初始化的列表的索引0中,并且bindingresult也将添加到索引0中。如果未将J设置为result2并使用bindingresult,则它仍将指向索引30,并且不会针对现在存储在索引0的字段显示错误消息。
现在,此更新的IncidentsForm和result2将被发送到jsp页面,该页面仅显示具有验证错误的行以及相应的错误消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句